Go是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了。Go是一种新的语言,一种并发的、带垃圾回收的、快速编译的语言。它具有以下特点:
Go是一门全新的静态类型开发语言,具有自动垃圾回收
,丰富的内置类型
,函数多返回值
,错误处理
,匿名函数
,并发编程
,反射
等特性。go
命令依赖一个重要的环境变量:$GOPATH,
GOPATH
允许多个目录,当有多个目录时,请注意分隔符,多个目录的时候Windows是分号;
当有多个GOPATH时
默认将go get
获取的包存放在第一个目录下。
2.1 GoRoot
其实就是golang 的安装路径。当Go语言的安装包刚下载完毕的时候,你把它解压或者直接安装到的那个目录,就是GOROOT 目录,GOROOT里面的代码都是系统驱动程序以及系统调用。此时你需要做一些额外的配置,将 GOROOT 这个环境变量设置一下,当然对应的 bin 目录你也得设置一下,否则操作系统找不到 go 的执行文件。比如你解压后安装到 /opt/go/ 目录下了,又或者在 Windows 下面你安装到了 C 盘 C:\\GO都是 OK 的,区别只是不同操作系统环境下设置的方法不同而已。
2.2 GoPath
在安装Go的时候看到需要设置GOPATH变量,Go从1.1版本到1.7必须设置这个变量,而且不能和Go的安装目录一样,这个目录用来存放Go源码,Go的可运行文件,以及相应的编译之后的包文件。所以这个目录下面有三个子目录:src、bin、pkg。从go 1.8开始,GOPATH环境变量现在有一个默认值,如果它没有被设置。 它在Unix上默认为$HOME/go,在Windows上默认为%USERPROFILE%/go。go 命令依赖一个重要的环境变量:$GOPATH;Windows系统中环境变量的形式为%GOPATH%
。GOPATH允许多个目录,当有多个目录时,请注意分隔符,多个目录的时候Windows是分号,Linux系统是冒号,当有多个GOPATH时,默认会将go get的内容放在第一个目录下。以上 $GOPATH 目录约定有三个子目录:
src 存放源代码(比如:.go .c .h .s等);
pkg 编译后生成的文件(比如:.a);
bin 编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中,如果有多个gopath,那么使用${GOPATH//://bin:}/bin
添加所有的bin目录);
2.3 GoBin
go install编译存放路径。不允许设置多个路径。可以为空。为空时则遵循“约定优于配置”原则,可执行文件放在各自GOPATH目录的bin文件夹中(前提是:package main的main函数文件不能直接放到GOPATH的src下面。Go配置完成后通过命令:go env查看配置的环境是否正确,配置示例如下所示:
GOARCH="amd64"
GOBIN="/Users/Gandoph/GoWork/bin"
GOCACHE="/Users/Gandoph/Library/Caches/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/Gandoph/GoWork"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/b0/zl92tk714t5dws59mvlwjzyw0000gn/T/go-build051831990=/tmp/go-build -gno-record-gcc-switches -fno-common"
三、目录结构与应用搭建
GOPATH下的src目录就是接下来开发程序的主要目录,所有的源码都是放在这个目录下面,那么一般我们的做法就是一个目录一个项目,例如: $GOPATH/src/myApp表示myApp这个应用包或者可执行应用,这个根据package是main还是其他来决定,main的话就是可执行应用,其他的话就是应用包。所以当新建应用或者一个代码包时都是在src目录下新建一个文件夹,文件夹名称一般是代码包名称,当然也允许多级目录,例如在src下面新建了目录$GOPATH/src/github.com/astaxie/beedb 那么这个包路径就是"github.com/astaxie/beedb",包名称是最后一个目录beedb。
$ cd $GOPATH/src
$ mkdir sqrt
$ cd sqrt
$ vim sqrt.go
package sqrt
func Sqrt(x float64) float64 {
z := 0.0
for i := 0; i < 1000; i++ {
z -= (z*z - x) / (2 * x)
}
return z
}
编译应用文件sqrt.go
go install
,就可以安装了;go install sqrt;
cd $GOPATH/pkg/${GOOS}_${GOARCH}
cd $GOPATH/src
mkdir myApp
cd myApp
vim main.go
package main
import (
"sqrt" //导入应用包sqrt
"fmt"
)
func main() {
fmt.Printf("Hello, world. Sqrt(2) = %v\n", mymath.Sqrt(2))
}
可以看到这个的package是main
,import里面调用的包是sqrt,这个就是相对于$GOPATH/src
的路径,如果是多级目录,就在import里面引入多级目录,如果你有多个GOPATH,也是一样,Go会自动在多个$GOPATH/src
中寻找。如何编译程序呢?进入该应用目录myApp,然后执行go build
,那么在该目录下面会生成一个myApp的可执行文件。用命令./myApp运行可执行程序输出如下内容:
Hello, world. Sqrt(2) = 1.414213562373095
go语言有一个获取远程包的工具就是go get(main.go所在的目录下)
,目前go get支持多数开源社区(例如:GitHub、googlecode、bitbucket、Launchpad)
go get github.com/astaxie/beedb
go get -u 参数可以自动更新包,而且当go get的时候会自动获取该包依赖的其他第三方包
通过这个命令可以获取相应的源码,对应的开源平台采用不同的源码控制工具,例如GitHub采用git、googlecode采用hg,所以要想获取这些源码,必须先安装相应的源码控制工具。 go get本质上可以理解为首先第一步是通过源码工具clone代码到src下面,然后执行go install(main.go所在的目录下)
。在代码中如何使用远程包,很简单的就是和使用本地包一样,只要在开头import相应的路径就可以:
import "github.com/astaxie/beedb"
bin/
myApp
pkg/
darwin_amd64 c//平台名如:darwin_amd64、linux_amd64
sqrt.a
github.com/
astaxie/
beedb.a
src/
myApp
main.go
sqrt/
sqrt.go
github.com/
astaxie/
beedb/
beedb.go
util.go
util_test.go
README.md
example/
asta.db
gomysql.go
mssql.go
mysql.go
pg.go
sqlite.go
因为GO的包搜索是从GOPATH和GOROOT路径下搜索,源码必须要放在GOROOT或GOPATH的src目录下才能找到。但把源码和包放在一起,对于很多人来说确实不太很习惯,有一种做法通过在GOPATH中设置两个路径,go get下载的包默认放在GOPATH设置的第一个路径下,源码src放在GOPATH的第二个路径下。比如GOPATH 设置如下,如此就可以把工作区设在 /usr/software/Work/go/src,而安装包放在 /usr/software/go/src:
export GOPATH=/usr/software/go/:/usr/software/Work/go
goroot/bin环境变量指明了go语言可执行脚本的位置;gopath/bin则指明了go项目编译生成可执行脚本的位置。使用命令:
vim ~/.bash_profile 添加Mac Go语言环境变量配置如下所示,使用命令:source ~/.bash_profile使环境变量生效。