包
每个go程序都是由包构成的,程序从main包开始运行
本程序通过导入路径"fmt"和"math/rand"来使用这两个包
import ( "fmt" "math/rand")func main() { fmt.Println("Hello, World!") var input string fmt.Scanln(&input) fmt.Println("你的输入是:%s", input) fmt.Println("My favorite number is", rand.Intn(10))}
按照约定,包名与导入路径的最后一个元素一致。
例如:"math/rand"包中的源码均以packange rand语句开始
注意:此程序的运行环境是固定的,因此rand.Intn总是返回相同的数字,要得不到的数字,需为生成器提供的不同的种子数。
包的价值:进行模块的解耦
Go语言中的包和其他语言的库或模块的概念类似,目的都是为了支持模块化,封装,单独编译和代码重用。
一个包的源代码保存在一个或多个以.go为文件后缀名的源文件中。
1、如果包中含有较多个.go源文件,它们将按照发给编译器的顺序进行初始化,Go语言的构建工具首先会将.go文件根据文件名排序,然后依次调用编译器编译。
2、对于在包级别声明的变量,如果有初始化表达式则用表达式初始化,还有一些没有初始化表达式的,例如某些表格数据初始化并不是一个简单的赋值过程。
包的init初始化函数
1、在这种情况下,我们可以使用一个特殊的init初始化函数来简化初始化工作
2、每个文件都可以包含多个init初始化函数
func init() { }
3、这样的init初始化函数不能被调用或引用,其他行为和普通函数类似
4、在每个文件中的init初始化函数,在程序开始执行时按照它们的声明的顺序自动被调用。
5、每个包在解决依赖的前提下,以导入声明的顺序初始化,每个包只会被初始化一次。
6、因此,如果一个P包导入了m包,那么在p包初始化的时候可以认为m包必然已经初始化过了。
7、初始化工作是自下而上进行的,main包最后被初始化。
8、以这种方式,可以确保在main函数执行之前,所以依赖的包都已经完成初始化工作了。
包的导入:
import导入包的用法:
import "github.com/tidwall/gjson" //通过包名gjson调用导出接口import json "github.com/tidwall/gjson" //通过别名json调用gjsonimport . "github.com/tidwall/gjson" //.符号表示,对包gjson的导出接口的调用直接省略包名import _ "github.com/tidwall/gjson" //_ 仅仅会初始化gjson,如初始化全局变量,调用init函数