京东-优惠雷达
新人页面
精选商品
首月0月租体验,领12个月京东PLUS
自营热卖

初识go语言

干净的像风 4月前   阅读数 53 0

初识Go语言

golang简介

Go语言也称为 Golang,是由 Google 公司的Robert Griesemer、Ken Thompson和Rob Pike三位大佬于2007年开始设计的一种静态强类型、编译型、并发型、并具有垃圾回收功能的编程语言。golang是一个开源项目,G具有很强的表达能力,它简洁、清晰而高效。得益于其并发机制, 用它编写的程序能够非常有效地利用多核与联网的计算机,其新颖的类型系统则使程序结构变得灵活而模块化。 Go 代码编译成机器码不仅非常迅速,还具有方便的垃圾收集机制和强大的运行时反射机制。 它是一个快速的、静态类型的编译型语言,感觉却像动态类型的解释型语言。

安装开发环境

Linux下安装

1.下载安装包并解压

cd /tmp  #下载到/tmp
wget  https://dl.google.com/go/go1.13.4.linux-amd64.tar.gz #go1,13
tar -zxf go1.13.4.linux-amd64.tar.gz

2.转移解压文件

mv /tmp/go /usr/local/

3.配置环境变量

vim /etc/profile

#在文件末尾添加以下内容:
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

4.查看结果

go env #查看go环境

5.运行示例程序

#在/tmp下创建hello.go
touch hello.go
#打开hello.go进行编程
vim hello.go

在hello.go中添加如下代码:

package main
import "fmt"

func main(){
     
    fmt.Println("hello,world")
}

使用GO工具编译执行上面的代码:

go run hello.go

若运行成功则会在命令行中打印"hello,world",此时go初始环境基本搭建完成。

go代码组织结构

GOPATH环境变量

GOPATH 环境变量指定了工作空间位置,工作空间可以设置在除go安装目录的任意位置。本文将工作空间放置在user家目录下的go文件夹,将GOPATH添加到环境变量:export GOPATH=$HOME/go,在将工作空间的bin子目录添加到环境变量PATH中:export PATH=$PATH:$GOPATH/bin:$GOROOT/bin

工作空间

如果不使用包管理工具,GO代码需要放在工作空间内,工作空间本质上是一个目录结构,里面需要包含三个子目录:

  • src:存放go程序源码,以包的形式存储;
  • pkg:存储从src目录编译的包对象,用于链接到bin的多个可执行文件中;
  • bin:存放程序编译后的可执行命令;

go工具用于构建源码包,并将其生成的二进制文件安装到pkg和bin中,src通常会包含很多版本控制的代码仓库;

包管理

如hello.go文件中的import "fmt",标准库中的包有给定的短路径,像 "fmt""net/http"。 对于自己的包,需要以基本路径的形式导入,以免和其他包发生同名冲突;如果要导入其他源码库中的代码,需要使用源码库的根目录作为基本路径。,若要导入 GitHub 用户的源码,需要将github.com/用户名 作为基本路径。包名为导入路径的最后一个元素,如 “crypto/rot13” 导入的包应命名为 rot13,含有程序执行入口的包(main函数)必须使用 package main,包名不需要是唯一的,但包的路径(完整文件名)必须是唯一的。

包导入

import( "fmt" )  //当只导入一个包时,括号可以省略

//Go标准库中的包是到GOROOT中加载,自定义的包是到GOPATH中加载,其根目录为GOPATH/src

//一些特殊用法
import( 
    . "fmt"   //这个包导入之后在调用这个包的函数时,可以省略前缀的包名
) 

import( 
    f "fmt"   //用别名代替包名
) 

import ( 
    _"fmt"  //表示并不想引用该包中的方法等,只希望导入包时自动执行其中的init()函数
)

注意:init函数会在每个包完成初始化后自动执行,执行顺序比main函数高。init 函数通常被用来对变量进行初始化以及检查/修复程序的状态等工作。包的初始化是根据依赖顺序进行的,而init函数的调用则是在最后一个依赖包初始化后开始往回逐层调用。

第一个程序

在工作空间的src/github.com/user中添加hello包(文件夹),并将之前测试用的hello.go复制到其中:

mkdir -p $GOPATH/src/github.com/user/hello
cp /tmp/hello.go $GOPATH/src/github.com/user/hello/hello.go

使用go工具构建并安装上述程序:

go install $GOPATH/src/github.com/user/hello

此命令会构建 hello 命令,产生一个可执行的二进制文件。 接着它会将该二进制文件作为 hello(在 Windows 下则为 hello.exe)安装到工作空间的 bin 目录中。 如本例则安装在 $HOME/go/bin/hello。可以在命令行下输入完整路径来运行它,若已经将 $GOPATH/bin 添加到 PATH 中了,只需输入该二进制文件名即可。

第一个库

编写一个自己的库并让之前的hello程序使用:先在工作空间的src/github.com/user中创建stringutil包(文件夹),并创建reverse.go文件:

mkdir $GOPATH/src/github.com/user/sutil
touch $GOPATH/src/github.com/user/sutil/reverse.go

在reverse.go中写入以下代码:

// stringutil 包含有用于处理字符串的工具函数。
package sutil

// Reverse 将其实参字符串以符文为单位左右反转。
func Reverse(s string) string {
     
	r := []rune(s)
	for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
     
		r[i], r[j] = r[j], r[i]
	}
	return string(r)
}

使用go build构建sutil文件夹,若在这个包中,可以直接使用go build命令构建:

go build $GOPATH/src/github.com/user/sutil #该命令不会输出任何

若要产生输出,则必须使用go install命令,它将会将包对象放到工作空间的pkg目录中:

go install $GOPATH/src/github.com/user/sutil #输出至工作空间pkg目录

修改hello.go,使用sutil.Reverse()函数:

package main

import (
	"fmt"

	"github.com/user/sutil"
)

func main() {
     
	fmt.Printf(stringutil.Reverse("hello,world"))
}

安装hello使用命令:go install github.com/user/hello;此时go会自动安装程序所依赖的其他包。

最后输入hello运行程序,并查看运行结果。

简单测试

Go自带一个轻量级的测试框架,由 go test 命令和 testing 包构成。通过创建一个名字以 _test.go 结尾的含有名为 TestXXX 且函数签名为 func (t *testing.T) 文件来编写测试。

创建文件 $GOPATH/src/github.com/user/sutil/reverse_test.go 来为 sutil 包添加测试,其内容如下:

package stringutil

import "testing"

func TestReverse(t *testing.T) {
     
	cases := []struct {
     
		in, want string
	}{
     
		{
     "Hello, world", "dlrow ,olleH"},
		{
     "你好, 世界", "界世 ,好你"},
		{
     "", ""},
	}
	for _, c := range cases {
     
		got := Reverse(c.in)
		if got != c.want {
     
			t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want)
		}
	}
}

若测试函数中触发了像 t.Errort.Fail 这些报错的函数,就会测试失败。

使用 go test 运行该测试:

go test github.com/user/stringutil  #自动补全GOPATH路径

#若在stringutil下编译,则可直接使用命令:
go test

远程包

go 工具可以从远程代码库自动获取包,如下所示,给出远程仓库包文件的地址,go get 会自动地获取、 构建并安装此包:

go get ithub.com/gin-gonic/gin

go常用命令

go get

用于使用代码管理工具远程拉取代码库及其依赖和拉取更新,使用该命令前需要安装诸如Git、SVN等代码管理工具,命令使用格式为 go get [选项] 域名/账户名/项目名,选项为可选项,有如下几种:

  • -d 只下载不安装;
  • -u 强制更新包及其依赖;
  • -f 只有包含-u时才有效,使执行-u操作时不验证每个已经获取的依赖;
  • -v 显示执行命令;
  • -t 同时下载运行和测试所需要的包;
  • -fix 获取源码后先运行fix,再做其他任务;
  • -insecure 允许使用不安全的HTTP方式进行下载;

一般情况下,go get是执行了两步操作,即先拉取源码,再对其执行go install生成对应的可执行文件和包对象,但若使用-d选项或源码库中没有可执行文件,则不会生成相应的二进制可执行文件。

go build

go build 命令主要用于编译程序源代码,需要时也会同时编译相关联的包依赖。go build可以同时编译多个文件,命令格式为 go build [选项 [参数]] 文件名1 文件名2 …,选项和参数如下所示:

  • -o 后面跟文件名或路径,显示指定可执行文件名称;
  • -v 编译时显示包名;
  • -p 后跟cpu逻辑核心数,开启并发编译;
  • -a 强制重新构建;
  • -n 打印编译时用到的所有命令;
  • -race 开启竞态检测;

go install

go install与go build相似,除了无法通过-o选项指定执行文件名,大多数选项都是通用的,区别在于go build直接将编译结果放项目目录下,而go install则会将编译结果放在GOPATH下的pkg和bin目录中,go build不能生成包文件,而go install必须依托GOPATH使用。

go run

go run 命令会编译源码,并且直接执行源码的 main函数,不会在当前目录留下可执行文件。

其他命令

go还有其他的命令:go test、go clean、go generate、go fmt和go pprof,将在其他章节详细介绍。


注意:本文归作者所有,未经作者允许,不得转载

全部评论: 0

    我有话说: