Go 安装配置与Demo

什么是Go ?

Go是一门 并发支持垃圾回收编译型系统编程语言,旨在创造一门具有静态编译语言的高性能和动态语言的高效开发之间拥有良好平衡点的一门编程语言。

适用场景

​ 主要是为了处理高并发和异步的场景,并简化代码,提高开发效率,提高项目运行时的稳定性。像是一些云产品处理高峰时候的并发请求,或者是一些桌面程序。Go的杀手级应用是Docker,其他是PaaS类型的项目,或是消息缓存中间件,日志收集等。可以看下这个知乎上面,这个回答:https://www.zhihu.com/question/296426314

主要特点

  • 类型安全内存安全
  • 以非常直观和极低代价的方案实现高并发
  • 高效的垃圾回收机制
  • 快速编译(同时解决C语言中头文件太多的问题)
  • 为多核计算机提供性能提升方案
  • UTF-8 编码支持

安装时的坑

当前环境为win10,安装文件地址为:https://golang.org/dl/

下载msi文件就可以了,执行它并按照安装的指导进行安装,会为我们在PATH配置好环境,并在用户系统变量中配置GOPATH,这个变量需要作修改。还有一个GOROOT变量指向我们的Go SDK路径(即安装Go的地址)。安装后,检验下:

1
2
3
4
# 查看安装的版本
go version
# 查看关于go的环境变量
go env

常用命令

  • go get : 获取远程包,需要git或hg环境

  • go run : 直接允许程序

  • go build : 测试编译,检查是否有编译错误

  • go fmt : 格式化源码

  • go install : 编译包文件并编译整个程序

  • go test : 运行测试文件

  • go doc : 查看包文档

在使用go get之前,可以修改下go proxy的地址

1
set GOPROXY = "https://goproxy.io,direct"

GOPATH的作用

在配置GO环境时,除了GOROOTPATH外,还需要在用户变量中修改GOPATH的值,这里指向工作空间的地址。在该工作空间中创建项目才可以运行,为什么会这样呢?

GOPATH 工作空间是一个目录层次结构,其根目录包含三个子目录(这些需要自己手动创建):

  • src:包含 Go 源文件,注意:你自己创建依赖的package,也要放到GOPATH目录下,这样才能够被引用到。
  • pkg:包含包对象,编译好的库文件
  • bin:包含可执行命令

GOPATH相对于工作区的概念,可以分为Go工作区和用户工作区,GOROOTGo核心工作区

GOPATH可以包含多个包含 Go 语言源码文件、包文件和可执行文件的路径,而这些路径下又必须分别包含三个规定的目录:srcpkgbin

程序的整体结构

1
2
3
4
5
6
7
8
9
10
11
12
13
bin
xxx
pkg
平台名/ 如:darwin_amd64、linux_amd64
mymath.a
xxx/
aa/
bb.a
src
xxx
xxx.go
xx2
xx2.go

Hello Go’s World

hello world

新建一个文件hello.go,内容如下:

文件名:hello.go
1
2
3
4
5
6
7
package main  // 包、表明代码所在模块或包

import "fmt" // 引入代码依赖

func main(){
fmt.Println("Hello,World!")
}

使用go run直接运行这个文件,会直接输出:

1
Hello,World!

也可以通过go build编译这个hello.go文件,编译后产生一个静态连接且独立的二进制文件hello.exe,可以复制到不同机器上运行(容器相关)。

1
go build hello.go

关于程序入口

Spring Boot相似,以application为项目入口启动程序。Go的可执行程序需要一个应用程序的入口,文件夹和文件名的名字随意(文件名一般是main.go),但是必须是main包,既package main,还有必须是main方法,既func main()。所以package的名字可以和目录名不一致。

Java中,package的名字需要和目录一致

退出返回值

func main()是不支持返回值,我们可以一试:

go
1
2
3
4
func main() int {
fmt.Println("Hello,World!");
+ return 1 ;
}

然后编译并允许,结果如下:

1
2
# command-line-arguments
.\hello.go:5:6: func main must have no arguments and no return values

可以通过os来返回值:

1
2
3
4
5
func main()   {
fmt.Println("Hello,World!");
- return 1 ;
+ os.Exit(123);
}

结果如下:

1
2
3
Hello,World!

Process finished with exit code 123

获取命令行参数

Java中,main一般这样写,其中String[] args用来接收一些参数:

1
2
3
public static void main(String[] args){
.....
}

然而在Go中不支持传入参数,func main(arg []string),这样在编译会产生错误提示。可以使用os.Args来获取命令行参数。

1
2
3
4
5
6
func main( )   {
- fmt.Println("Hello,World!");
+ if len(os.Args)>1 {
+ fmt.Println("Hello,World!",os.Args[1]);
+ }
}

然后在终端中输入:

1
go run hello.go Zing

结果:

1
Hello,World! Zing

其中:os.Args[0]会输出hello.go二进制文件的地址。

其他

本地web文档

一般在命令中输入go doc来查找有点麻烦,资源网站访问有时加载很慢。所以可以尝试下在本地启动web文档,在一些比较老的版本中:

1
godoc -http=localhost:8088

在新版本中,默认不带有godoc,需要自行安装:

1
go get golang.org/x/tools/cmd/godoc

若遇到下载不成功的问题,考虑调整Go的代理地址。

安装成功后,在GOPATH中的bin文件夹里,在里面使用。也可以将其复制到GOROOTbin中,这样在任意文件夹位置都可以使用。

参考资料

  1. 《The Way To Go》: https://www.cntofu.com/book/14/index.html
  2. Go-Wiki : http://code.google.com/p/go-wiki
  3. go 中文地址 : https://golang.google.cn/
- the End -
0%