package
包(package)fmtosio

包的定义

src 目录是以代码包的形式组织并保存 Go 源码文件的。每个代码包都和 src 目录下的文件夹一一对应。每个子目录都是一个代码包。

!! 代码包包名和文件目录名,不要求一致。比如文件目录叫 server,但是代码包包名可以声明为 “main”,但是同一个目录下的源码文件第一行声明的所属包,必须一致!
.go

注意事项:

packagepackage-mainmainimport

可见性

如果想在一个包中引用另外一个包里的标识符(如变量、常量、类型、函数等)时,该标识符必须是对外可见的(public)。在Go语言中只需要将标识符的首字母大写就可以让标识符对外可见了:

结构体中的字段名和接口中的方法名如果首字母都是大写,外部包可以访问这些字段和方法:

main包

Go 语言的入口 main() 函数所在的包(package)叫 main,main 包想要引用别的代码,需要import导入!

包的导入(import)

import

A:通常导入

B:点操作 有时候会看到如下的方式导入包

fmt.Println("hello world")Println("hello world")

注意事项:

$GOPATH/src//

自定义包名

自定义包名顾名思义可以把包命名成另一个用起来容易记忆的名字。导入时,可以为包定义别名,语法演示:

匿名导入包

_

这个操作经常是让很多人费解的一个操作符:

init()
!! 导入的包的路径名,可以是相对路径也可以是绝对路径,推荐使用绝对路径(起始于工程根目录)。

匿名导入的包与其他方式导入的包一样都会被编译到可执行文件中。

init()函数

init()函数介绍

init()init()init()

包初始化执行的顺序如下图所示:

init()函数执行顺序

main
init()
!! 禁止循环引用包:A -> B -> C -> A

init函数与main函数的异同

相同点:

  • 两个函数在定义时不能有任何的参数和返回值。 都只能由 go 程序自动调用,不可以被引用。

不同点:

  • init 可以应用于任意包中,且可以重复定义多个。 main 函数只能用于 main 包中,且只能定义一个。
  • 两个函数的执行顺序:
    在 main 包中的 go 文件默认总是会被执行。对同一个 go 文件的 init( ) 调用顺序是从上到下的。
    对同一个 package 中的不同文件,将文件名按字符串进行“从小到大”排序,之后顺序调用各文件中的init()函数。
    对于不同的 package,如果不相互依赖的话,按照 main 包中 import 的顺序调用其包中的 init() 函数。
    如果 package 存在依赖,调用顺序为最后被依赖的最先被初始化,例如:导入顺序 main –> A –> B –> C,则初始化顺序为 C –> B –> A –> main,一次执行对应的 init 方法。main 包总是被最后一个初始化,因为它总是依赖别的包