1、Go几个相关的环境变量
(1)$GOROOT:Go 的安装根目录,Linux 下的环境默认是/usr/local/go。
(2)$GOPATH :Go 语言编程的工作目录( workspace 如果没有设置 PATH 环境变 ,则linux下系统默认是/HOME/go)
(3)$GOBIN 是带有 main 函数的源程序执行 go install 时生成的可执行程序安装目录,默认是$GOPATH/bin。如果想在任何路径执行安装的程序,则可以将$GOBIN 添加到$PATH中。
(4)$GOOS 用来设置目标操作系统, $GOARCH 用来设置目标平台的 CPU 体系结构, 这两个参数主要 在交叉编译中。
2、作用域
(1)全局作用域:在任何地方都可以访问的标识梢,称其具有全局作用域
i. Go 语言内置的预声明标识符(包括预声明的类型名、关键字、内置函数等〉,它们具有全局作用域,在任意命名空间内都可见。
ii. Go 言包内以大写字母开头的标识符(包括变量、常量、函数和方法名、自定义类型、结构字段等),它们具有全局作用域,在任意命名空间内都可见。
(2)包内作用域:在Go语言包内定义的以小写字母开头的标识符(变 常量、函数和方法名、自定义类
型、结构字段等〉,它们在本包可见,在其他包都是不可见的,这些标识符具有包内作用域。
(3)隐式作用域:每个代码块内定义的变量称为“局部变量’ ,这些局部变量只在当前代码块内可见,其作用域属于当前代码块的隐式作用域。
3、包的习惯用法:
(1)包名一般是小写的,使用一个简短的命名。
(2)包名一般要和所在的目录同名。
(3)包一般放到公司的域名目录下,这样能保证包名的唯一性,便于共享代码,比如个人的GitHub 项目的包一般放在$GOPATH/src/github.com/userName/projectName目录下。
4、包引用注意事项
(1)一个包可以有多个 init 函数,包加载会执行全部的 init 函数,但并不能保证执行顺序,所以不建议在一个包中放入多个 init 函数,将需要初始化的逻辑放到一个 init 函数里面。
(2)包不能出现环形引用 比如包 引用了包 ,包 引用了包 ,如果包 又引用了包 a,则编译不能通过。
(3)包的重复引用是允许的 ,比如包a用了包b和c包 ,包b和包c都引用了d包 这种场景相当于重复引用了d ,这种情况是允许的, 并且Go编译器保证d的 init 函数只会执行一次。
5、包的初始化特点:
(1)包初始化程序从 main 函数引用的包开始,逐级查找包的引用,直到找到没有引用其他的包,最终生成一个包引用的有向无环图。
(2)Go 编译器会将有向无环图转换为一棵树,然后从树的叶子节点开始逐层向上对包进行初始化。
(3)单个包的初始化过程先初始化常 ,然后是全局变量,最后执行包的init 函数(如果有)。
6、第三方包管理
(1)vender:vendor 将原来放在$GOPATH/src 的第 方包放到当前工程的 vendor 目录中进行管理 它为工程独立的管理自己所依赖第 方包提供了保证 多个工程独 理自己的第 方依赖包,它们之间不会相互影响 vendor 将原来包共 模式转换为 个工 维护的模式, vendor个好处是保证了工程目录下代码的完整性,将工程代码复制到其他 Go 编译环境,不需要再去下载第 方包 直接就能编译,这种隔离和解稿的设计思路是 大进步,流程如下:
(1)如果当前包下有 vendor ,则从其下查找第三方的包,如果没有找到,则继续执行下一步操作。
(2)如果当前包目录下没有 vendor 目录,则沿当前包目录向上逐级目录查找 vendor 目录直到找到 GOPATH/s rc 下的 vendor 目录,只要找到 vendor 目录就去其下查找第三方的包,如果没有则执行下一步操作。
(3)在GOPATH 下面查找依赖包。
(4)在GOROOT 目录下查找依赖包。
注:vendor 有一个重要的问题没有解决,那就是对外部依赖的第三方包的版本管理。通常使用go get -u更新第三方包。默认的是将工程的默认分支的最新版本拉取到本地,并不能指定第三方包的版本。在实际包升级过程中,如果发现新版本有问题,则不能很快回退,这是个问题Go 官方的 依赖管理工具( dep )就是为了解决该问题而出现的。