写点什么

Go 学习笔记之 包与文件

发布于: 3 小时前
Go 学习笔记之 包与文件

Go 语言中的包和其他语言的库或模块的概念类似,目的都是为了支持模块化、封装、单独编译和代码重用。一个包的源代码保存在一个或多个以.go 为文件后缀名的源文件中,通常一个包所在目录路径的后缀是包的导入路径。

例如:包 gopl.io/ch1/helloworld 对应的目录路径是 $GOPATH/src/gopl.io/ch1/helloworld。

每个包都对应一个独立的名字空间。

例如,在 image 包中的 Decode 函数和在 unicode/utf16 包中的 Decode 函数是不同的。

要在外部引用该函数,必须显式使用 image.Decode 或 utf16.Decode 形式访问。

包还可以让我们通过控制哪些名字是外部可见的来隐藏内部实现信息。

在 Go 语言中,一个简单的规则是:如果一个名字是大写字母开头的,那么该名字是导出的

因为汉字不区分大小写,因此汉字开头的名字是没有导出的


每个源文件都是以包的声明语句开始,用来指明包的名字。

因为包级别的常量名都是以大写字母开头,它们可以像 tempconv.AbsoluteZeroC 这样被外部代码访问:

fmt.Printf("Brrrr! %v\n", tempconv.AbsoluteZeroC) // "Brrrr! -273.15°C"
复制代码


导入包

在 Go 语言程序中,每个包都有一个全局唯一的导入路径。导入语句中类似"gopl.io/ch2/tempconv"的字符串对应包的导入路径。Go 语言的规范并没有定义这些字符串的具体含义或包来自哪里,它们是由构建工具来解释的。

除了包的导入路径,每个包还有一个包名,包名一般是短小的名字(并不要求包名是唯一的),包名在包的声明处指定。按照惯例,一个包的名字和包的导入路径的最后一个字段相同,例如 gopl.io/ch2/tempconv 包的名字一般是 tempconv。

// Cf converts its numeric argument to Celsius and Fahrenheit.package main
import ( "fmt" "os" "strconv" "gopl.io/ch2/tempconv")
func main() { //.......}
复制代码

导入语句将导入的包绑定到一个短小的名字,然后通过该短小的名字就可以引用包中导出的全部内容。

包的初始化

包的初始化首先是解决包级变量的依赖顺序,然后按照包级变量声明出现的顺序依次初始化:

var a = b + c // a 第三个初始化, 为 3var b = f()   // b 第二个初始化, 为 2, 通过调用 f (依赖c)var c = 1     // c 第一个初始化, 为 1
func f() int { return c + 1 }
复制代码

如果包中含有多个.go 源文件,它们将按照发给编译器的顺序进行初始化,Go 语言的构建工具首先会将.go 文件根据文件名排序,然后依次调用编译器编译。

每个包在解决依赖的前提下,以导入声明的顺序初始化,每个包只会被初始化一次。因此,如果一个 p 包导入了 q 包,那么在 p 包初始化的时候可以认为 q 包必然已经初始化过了。初始化工作是自下而上进行的,main 包最后被初始化。以这种方式,可以确保在 main 函数执行之前,所有依赖的包都已经完成初始化工作了。



作者:架构精进之路,十年研发风雨路,大厂架构师,CSDN 博客专家,专注架构技术沉淀学习及分享,职业与认知升级,坚持分享接地气儿的干货文章,期待与你一起成长

关注并私信我回复“01”,送你一份程序员成长进阶大礼包,欢迎勾搭。



Thanks for reading!

发布于: 3 小时前阅读数: 3
用户头像

坚持分享接地气儿的架构技术文章! 2018.02.26 加入

同名微信公众号「架构精进之路」,专注软件架构研究,技术学习与职业成长!坚持原创总结、沉淀和分享,希望能带给大家一些引导和启发,感谢各位的支持(关注、点赞、分享)!

评论

发布
暂无评论
Go 学习笔记之 包与文件