概述

关于语言的名称官方说法

The language is called Go. The “golang” moniker arose because the web site is golang.org, not go.org, which was not available to us. Many use the golang name, though, and it is handy as a label. For instance, the Twitter tag for the language is “#golang”. The language’s name is just plain Go, regardless. A side note: Although the official logo has two capital letters, the language name is written Go, not GO.

安装

安装包安装

Golang的官方 https://golang.org/dl/
image.png
安装包安装时最简单快捷的的,根据操作系统下载软件包按照提示安装就可以,windos 下载msi文件格式的安装包,macOS下载pkg格式安装包,pkg安装文件安装的路径地址是 usr/local/go

二进制包安装

二进制包就是已经编译好的包。去官方下载当前开发机所使用的系统
image.png

  1. 下载开发版本的压缩包
  2. 解压安装包 安装包的解压路径放在/usr/local目录下
  1. tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz

源码编译

go的源码托管在github上,地址:https://github.com/golang/go
如果是使用源码安装需要安装1.4版本的,然后在安装后续升级的版本。

  1. $ wget https://dl.google.com/go/go1.4-bootstrap-20171003.tar.gz
  2. $ tar -xf go1.4-bootstrap-20171003.tar.gz
  3. $ cd go/src
  4. $ ./make.bash

安装1.4成功

  1. Installed Go for linux/386 in /home/ubuntu/go
  2. Installed commands in /home/ubuntu/go/bin
  3. ubuntu@VM-0-12-ubuntu:~/go/src$ cd ../
  4. ubuntu@VM-0-12-ubuntu:~/go$ cd ../
  5. ubuntu@VM-0-12-ubuntu:~$ ls
  6. download go go1.4-bootstrap-20171003.tar.gz
  7. ubuntu@VM-0-12-ubuntu:~$ mv go go1.4

安装最新版本的1.10

  1. $ wget https://studygolang.com/dl/golang/go1.10.src.tar.gz
  2. $ tar -xf go1.10.src.tar.gz
  3. $ cd go/src
  4. $ ./all.bash

1.10安装成功

  1. ALL TESTS PASSED
  2. ---
  3. Installed Go for linux/386 in /home/ubuntu/go
  4. Installed commands in /home/ubuntu/go/bin
  5. *** You need to add /home/ubuntu/go/bin to your PATH.

设置安装路径

  1. ubuntu@VM-0-12-ubuntu:~$ sudo mv go /usr/local/go1.10
  2. ubuntu@VM-0-12-ubuntu:~$ vim /etc/profile
  3. ubuntu@VM-0-12-ubuntu:~$ source /etc/profile
  4. ubuntu@VM-0-12-ubuntu:~$ go version
  5. go version go1.10 linux/386
  6. ubuntu@VM-0-12-ubuntu:~$ vim main.go
  7. ubuntu@VM-0-12-ubuntu:~$ go run main.go
  8. hello, world

MAC OS

MAC os 还可以使用 Homebrew安装Go
如果没有安装Homebrew,需要执行下面的安装命令,安装Homebrew,

  1. /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

关于Homebrew使用命令可以参考https://www.yuque.com/baxiang/linux/homebrew,下面的命令是安装go

  1. brew install go
  2. ==> Downloading https://homebrew.bintray.com/bottles/go-1.9.2.high_sierra.bottle.tar.gz
  3. ######################################################################## 100.0%
  4. ==> Pouring go-1.9.2.high_sierra.bottle.tar.gz
  5. ==> Caveats
  6. A valid GOPATH is required to use the `go get` command.
  7. If $GOPATH is not specified, $HOME/go will be used by default:
  8. https://golang.org/doc/code.html#GOPATH
  9. You may wish to add the GOROOT-based install location to your PATH:
  10. export PATH=$PATH:/usr/local/opt/go/libexec/bin
  11. ==> Summary
  12. 🍺 /usr/local/Cellar/go/1.9.2: 7,646 files, 293.9MB

环境变量

需了解三个环境变量,分别是GOROOT、GOPATH,GOPROXY

GOROOT

Go 语言安装根目录的路径,也就是GO语言的安装路径,官方推荐的目录地址一般在GOROOT=”/usr/local/go”
在 GO 1.10 之前,我们需要视不同安装方式决定是否手动配置。比如源码编译安装,安装时会有默认设置。而采用二进制包安装,在windows系统中,推荐安装位置为C:\GO,在Linux、freeBSD、OS X系统,推荐安装在/usr/local/go下。如果要自定义安装位置,必须手动设置GOROOT。如果采用系统方式安装,这一切已经帮我们处理好了。
关于这个话题,推荐阅读:you-dont-need-to-set-goroot和分析源码安装go的过程。
在 GO 1.10 及以后,这个变量已经不用我们设置了,它会根据go工具集的位置,即相对go tool的位置来动态决定GOROOT的值。说简单点,其实就是go命令决定GOROOT的位置。
关于这个话题,推荐阅读:use os.Executable to find GOROOTgithub go issues 25002

GOPROXY

由于众所周知的原因,国内无法使用一些谷歌的库,需要设置代理
具体国内设置网站 https://goproxy.io/
最终执行 go env 命令会看到如下环境变量

  1. GOPROXY="https://goproxy.io"

GOPATH

GOPATH是用户自定义的工作区,我们通常开发项目代码都会放在GOPATH的工作区中,在go 1.8之前,该变量必须手动设置。go 1.8及之后,如果没有设置,默认在$HOME/go目录下,即你的用户目录中的go目录下。它应包含3个子目录:src目录、pkg目录、bin目录

  1. src :这个目录是你开发程序的主目录,所有的源码都是放在这个目录下面进行开发。通常的做法是一个目录为一个独立的项目。例如 $GOPATH/src/hello就表示 hello 这个应用/包。因此,每当开发一个新项目时,都需要在 $GOPATH/src/下新建一个文件夹用作开发。当你在引用其他包的时候,Go 程序也会以 $GOPATH/src/目录作为根目录进行查找。当然了, src 目录允许存在多级目录,例如在 src 下面新建了目录 $GOPATH/src/github.com/baxiang/hello,那么这个包路径就是 github.com/golang/baxiang/hello,包名称为最后一个目录 hello。。
  2. pkg:用于存放通过go install命令安装后的代码包的归档文件((archive file,也就是以“.a”为扩展名的文件))
  3. bin: 一般通过执行go install命令完成安装后,保存由Go命令源码文件生成的可执行文件(executable file)

    设置环境变量

    对于>=1.13版本的go,可以直接使用go env -w 设置环境变量
  1. go env -w GOPATH=$HOME/go

设置GOPROXY

  1. $ go env -w GO111MODULE=on
  2. $ go env -w GOPROXY=https://goproxy.cn,direct

设置开启

  1. go env -w GO111MODULE=on

如果需要重置某个变量数据或者出现下面的警告错误

  1. warning: go env -w GOPROXY=... does not override conflicting OS environment variable

执行下面的重置命令

  1. unset GOPROXY

对于<1.13版本的,打开/etc/profile或者~/.bash_profile文件,其中/etc/profile需要有sudo 权限 而且设置成为全局的环境变量

  1. export GOPATH=$HOME/go
  2. export PATH=$PATH:$GOPATH/bin
  3. export PATH=$PATH:/usr/local/go/bin

执行下面的命令完成对golang环境变量的配置。

  1. source /etc/profile
  2. source ~/.bash_profile

查看当前设置的环境变量参数

  1. $ go env

Go Playground

一般小规模运行代码 或则希望把自己运行代码分享给其他人 可以使用The Go Playground,这是一个可以在线运行Go的环境
https://play.golang.org/

图片.png

开发IDE

GOLANG

jetbrains公司开发的,收费软件,但是目前个人感觉非常棒的的Go开发IDEA
下载地址:https://www.jetbrains.com/go/
image.png

VSCODE

下载地址:https://code.visualstudio.com/
image.png
需要安装go开发的插件

image.png
image.png

IDEA

https://www.jetbrains.com/idea/
jetbrains经典的开发IDEA,从事过JAVA开发的同学最熟悉不过了,同样也是收费软件 ,进行Go开发需要安装go开发的插件。
image.png

Hello World

创建以go为后缀名的文件 hello.go

  1. touch hello.go

执行如下的命令尝试进行编译

  1. $ go run hello.go

将会打印出如下错误:

  1. package main:
  2. hello.go:1:1: expected 'package', found 'EOF'

在Go语言中,所有文件必须隶属于某一个包。当前,只需要理解在文件的头部声明一个package name就可以了,其中package为关键字,name为自定义的包名称。在大型的程序中,包可以很好的有条理的组织各种功能。
go程序的入口必须声明的package名是main,即package main,在hello.go文件首部中添加package main,现在文件内容如下:

  1. package main

执行go run hello.go后,会打印如下错误:

  1. # command-line-arguments
  2. runtime.main_main·f: function main is undeclared in the main package

Go程序启动时,需要在文件中有一个可标识入口。使用关键字func 定义一个函数,函数名是main ,代表着是GO程序的入口函数在hello.go文件中添加另外一行。

  1. package main
  2. func main() {
  3. }

执行go run hello.go程序正确执行,但是由于main函数没有任何操作,程序很快就退出了。
让我们在main函数中添加执行命令内容,Println是控制台打印内容

  1. package main
  2. func main(){
  3. Println("hello world")
  4. }

执行go run hello.go,将会打印如下错误

  1. # command-line-arguments
  2. ./hello.go:4:2: undefined: Println

编译器报Println函数未定义,Println函数存放在某些包中。然而,当前这些包由于我们没有主动引入,使用import 关键字引用一个叫fmt的包,引入的可以是标准库的包,也可以是第三方包或者自定义包名,fmt是标准的输入/输出包,是formatting的缩写.我们再添加几行代码,调用fmt包里面的Printf函数,调用包里面的方法通过点’.’访问符,函数实参是一个字符串,

  1. package main
  2. import "fmt"
  3. func main() {
  4. fmt.Println("hello world")
  5. }

运行程序go run hello.go ,输出如下:

  1. hello world

常用系统命令

  1. go help
  2. Go is a tool for managing Go source code.
  3. Usage:
  4. go command [arguments]
  5. The commands are:
  6. build compile packages and dependencies
  7. clean remove object files
  8. doc show documentation for package or symbol
  9. env print Go environment information
  10. bug start a bug report
  11. fix run go tool fix on packages
  12. fmt run gofmt on package sources
  13. generate generate Go files by processing source
  14. get download and install packages and dependencies
  15. install compile and install packages and dependencies
  16. list list packages
  17. run compile and run Go program
  18. test test packages
  19. tool run specified go tool
  20. version print Go version
  21. vet run go tool vet on packages
  22. Use "go help [command]" for more information about a command.
  23. Additional help topics:
  24. c calling between Go and C
  25. buildmode description of build modes
  26. filetype file types
  27. gopath GOPATH environment variable
  28. environment environment variables
  29. importpath import path syntax
  30. packages description of package lists
  31. testflag description of testing flags
  32. testfunc description of testing functions
  33. Use "go help [topic]" for more information about that topic.

go env

查看本地go环境变量

  1. go env
  2. GOARCH="amd64"
  3. GOBIN=""
  4. GOCACHE="/home/baxiang/.cache/go-build"
  5. GOEXE=""
  6. GOFLAGS=""
  7. GOHOSTARCH="amd64"
  8. GOHOSTOS="linux"
  9. GOOS="linux"
  10. GOPATH="/home/baxiang/go"
  11. GOPROXY=""
  12. GORACE=""
  13. GOROOT="/usr/local/go"
  14. GOTMPDIR=""
  15. GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
  16. GCCGO="gccgo"
  17. CC="gcc"
  18. CXX="g++"
  19. CGO_ENABLED="1"
  20. GOMOD=""
  21. CGO_CFLAGS="-g -O2"
  22. CGO_CPPFLAGS=""
  23. CGO_CXXFLAGS="-g -O2"
  24. CGO_FFLAGS="-g -O2"
  25. CGO_LDFLAGS="-g -O2"
  26. PKG_CONFIG="pkg-config"
  27. GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build680337534=/tmp/go-build -gno-record-gcc-switches"

官方的说明文档

  1. $ go help env
  2. usage: go env [-json] [-u] [-w] [var ...]
  3. Env prints Go environment information.
  4. By default env prints information as a shell script
  5. (on Windows, a batch file). If one or more variable
  6. names is given as arguments, env prints the value of
  7. each named variable on its own line.
  8. The -json flag prints the environment in JSON format
  9. instead of as a shell script.
  10. The -u flag requires one or more arguments and unsets
  11. the default setting for the named environment variables,
  12. if one has been set with 'go env -w'.
  13. The -w flag requires one or more arguments of the
  14. form NAME=VALUE and changes the default settings
  15. of the named environment variables to the given values.
  16. For more about environment variables, see 'go help environment'.

-json 以json格式展示环境信息
同时可以-w来设置,将第三方包的下载将通过国内镜像,避免出现官方网址被屏蔽的问题。
当你安装的GO的语言版本大于1.13的时候,那么就不用这么麻烦了,直接使用go env -w命令就行了

  1. go env -w GOPROXY=https://goproxy.cn,direct
  2. go env -w GO111MODULE=on

低于版本的需要在当前环境变量增加

  1. # Enable the go modules feature
  2. export GO111MODULE=on
  3. # Set the GOPROXY environment variable
  4. export GOPROXY=https://goproxy.io

或者使用阿里云的镜像

  1. https://mirrors.aliyun.com/goproxy/

go get

这个 命令时常会用。用于动态获取远程仓库中的代码包及其依赖,并进行安装。这个命令实际上分为两步:第一步是下载源码包,第二步是执行 go install 安装。下载源码包的 go 工具会自动根据不同的域名调用不同的源码工具。例如下载 Github 上的代码包时则是利用系统的 Git 工具。
所以为了 go get 能正常工作,你必须确保安装了合适的源码管理工具。另外,go get 支持自定义域名的功能,具体参见 go help remote。
图片.png
常用参数:

  1. -u - 强制使用网络去更新包和它的依赖包
  2. -d - 只下载不安装
  3. -fix - 在获取源码之后先运行fix,然后再去做其他的事情
  4. -t - 同时也下载需要为运行测试所需要的包
  5. -v - 显示执行的命令

只有当你指定 -u 时,不管你需不需要更新,都会触发重新下载强制更新。

  1. # 拉取最新
  2. go get github.com/foo
  3. # 最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
  4. go get -u github.com/foo
  5. # 升级到最新的修订版本
  6. go get -u=patch github.com/foo
  7. # 指定版本,若存在tag,则代行使用
  8. go get github.com/foo@v1.2.3
  9. # 指定分支
  10. go get github.com/foo@master
  11. # 指定git提交的hash值
  12. go get github.com/foo@e3702bed2

go run

直接从源码文件运行编译任务并执行编译文件。

go build

这个命令主要用来编译代码,Go 是一门编译型语言,因此需要将源码编译为二进制文件之后才能执行。该命令即可将源码文件编译为对应的二进制文件。若有必要,会同时编译与之相关联的包。
如果是普通包,当执行 go build 之后,它不会产生任何文件。如果需要在$GOPATH/pkg 下生成相应的文件,则需要执行 go install 命令完成。
如果是 main 包,当执行 go build 之后,它就会在当前目录下生成一个可执行文件。如果需要在 GOPATH/pkg或者$GOPATH/bin中下生成相应的文件,需要执行 go install,或者使用 go build -o 路径。
如果某个项目文件夹下有多个文件,而你只想编译某个文件,可以在 go build 之后加上文件名,例如 go build hello.go,go build 命令默认会编译当前目录下的所有 go 文件。
可以通过 -o NAME 的方式指定 go build 命令编译之后的文件名,默认是 package 名(非 main 包),或者是第一个源文件的文件名(main 包)。
go build 会忽略目录下以“_”或“.”开头的 go 文件。

go clean

移除当前源码包和关联源码包里面编译生成的文件。
go clean 有不少的参数:

  • -i:清除关联的安装的包和可运行文件,也就是通过go install安装的文件;
  • -n: 把需要执行的清除命令打印出来,但是不执行,这样就可以很容易的知道底层是如何运行的;
  • -r: 循环的清除在 import 中引入的包;
  • -x: 打印出来执行的详细命令,其实就是 -n 打印的执行版本;
  • -cache: 删除所有go build命令的缓存
  • -testcache: 删除当前包所有的测试结果

    go fmt

    Go 语言有标准的书写风格,不按照此风格的代码将不能编译通过,为了减少浪费在排版上的时间,go fmt 命令可以帮你格式化你写好的代码文件,使你写代码的时候不需要关心格式,你只需要在写完之后执行 go fmt filename.go,你的代码就被修改成了标准格式。

    go install

    编译和安装包及其依赖。在内部实际上分成了两步操作:第一步是生成结果文件(可执行文件或者包),第二步会把编译好的结果移到 `

    go test

    读取源码目录下面名为 *_test.go 的文件,生成并自动运行测试用的可执行文件。
    1. -bench regexp - 执行相应的 benchmarks
    2. -cover - 开启测试覆盖率。
    3. -run regexp - 只运行 regexp 匹配的函数。
    4. -v - 显示测试的详细命令。

go tool

一些有用的工具集合。常用的有:

  1. go tool fix . 用来修复以前老版本的代码到新版本。
  2. go tool vet directory|file 用来分析当前目录的代码是否都是正确的代码,例如函数里面提前 return 导致出现了无用代码之类的。

go doc

为 go 程序自动提取和生成文档,或者查看某个 package 的文档。
例如,查看 fmt 的文档,使用 godoc fmt 即可。
支持查看包中的某个函数,例如 godoc fmt Printf。
支持使用 -http 参数开启一个本地服务,用于展示 golang.org 的上的官方文档。例如:godoc -http=:8080。

参考文章

https://golang.org/doc/code.html
https://goproxy.io/
https://github.com/golang/go/wiki/SettingGOPATH
https://golang.org/cmd/go/#hdr-Environment_variables
http://poloxue.com/go/how-to-install-go/