您的位置:首页 > 编程语言 > Go语言

Golang 学习之路二:工作区,源码文件,源码包,初始化函数

2017-04-20 16:53 316 查看

Golang :工作区,源码文件,源码包,初始化函数

一、工作区和GOPATH

Go工作区是放置Go源码文件的目录,我们一般把源码文件存放在工作区中。但是,命令源码文件可以不放在工作区。

工作区的结构:

/WorkSpace:
>/bin
>/pkg
>/src


[bin] : 存放当前工作区的Go程序的可执行文件

[pkg]:用于存放归档文件,名称以.a为后缀名,它是存放在<工作区>/pkg/<平台相关目录>/ 这个目录下。

注:平台相关目录,是根据PC的操作系统和架构确定的,比如Linux amd64,windows_386等。

[src] : 用于存放源码文件主要以代码包的形式。

注意,[bin]在下面两种情况下会失效:

a、GOBIN 设置有效

b、GOPATH 包含多个工作区

一般在GOPATH 包含多个工作区时,就需要设置GOBIN,就像上篇文章中在Linux的GOAPT

export GOPATH=~/golib:~/goproject


此时,就必须要这只GOBIN了,而在windows开发环境配置的时候我们只设置一个工作区,所以可以不使用GOBIN,安装后的可执行文件就在[bin]下,否则就会在GOBIN对应的目录下。

二、Go 源码文件

Go 的源码文件名称是以 .go 为后缀的,内容是以Go语言代码组成的文件,多个代码文件是用代码包组织起来的。

Go 源码文件的分类:

a、命令源码文件 b、库源码文件 -> Go 语言程序

c、测试源码文件 -> 辅助源码文件

a、命令源码文件:声明自己属于main代码包,包含无参数声明和结果声明的main函数,被安装后的可执行文件存放在GOBIN 或当前工作路径下的bin目录下,它是Go语言程序的入口。

b、库源码文件:不具备包含无参数声明和结果声明的main函数的特征。它被安装之后相应的归档文件会被存放在 /<工作区>/pkg/<平台相关目录>/ 路径下.

c、测试源码文件:与库源码文件一样不具备命令源码文件拥有的上述特征。它的名称是以 _test.go 为后缀,它需要有测试函数,所以它至少有一个函数名称以Test或Benchmark为前缀的函数,分别接受一个类型*testing.T 或 *testing.B的参数。

例:

func TestFind(t *testing.T){
//功能测试函数
}
func BenchmarkFind(b *testing.B){
//性能测试函数
}


三、代码包

1、代码包的作用

编译和归档Go程序的基本单位,划分、集结和依赖的有效组织形式,也是权限控制的辅助手段。

2、代码包的规则

一个代码包实际上就是一个由导入路径代表的目录,导入路径即:/<工作区目录>/(src/pkg)/<平台相关>/目录下某段子路径。

3、代码包声明

每个源码文件必须声明其所属的代码包,同一个代码包中的所有源码文件应该是相同的

4、代码包声明与导入路径的区别

代码包声明语句中的包名称应该是该代码包的导入路径的最右自路径。

导入路径:github.com\lxn\walk
声明:package walk


5、代码包的导入

a、使用import关键字,导入要使用的标准库包或第三方依赖包

//导入标准库包fmt示例
package main
import "fmt"
func main(){
fmt.Println("Hello World")
}


//导入第三方包示例
import “github.com/bitly/go-nsq”


b、可以使用import 导入多个包

import(
"fmt"
"strings"
"github.com/bitly/go-nsq"
)


c、可以使用别名,类似python中的imort xx as yy

import str "strings"


d、可以使用本地导入,类似于python中的from xx import *

import . "strings"


e、初始化导入

import _ "strings"


这个导入,只是对代码包进行了初始化。在Go 语言程序编译时,如果import了一个包,在程序中必须使用它,否则编译会出错。你可以用此方法避免报错,这在调试程序有一定用途,当然有些包在初始化时会有其它更多用途。

四、代码包的初始化函数

1、代码包初始化函数

无参数声明和结果声明的init函数,init函数可以被声明在任何文件中,而且可以有多个。

2、Init函数执行时机

a、单一代码包:

对所有全局变量求值 -> 执行所有init函数(执行顺序不确定)。

b、不同代码包:

执行被导入的代码包中的init函数 ->执行导入它那个包的init 函数。

c、所有被涉及的代码包:

引入的包 -> 当前包中的全局变量求值 -> 当前包的 init 函数 ->main函数。

注意以下几点:

避免死循环:A -> B -> C -> A 。

一个包被多个包引入,但是它只初始化一次。

被依赖的包优先初始化。

main函数最后一个初始化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: