-
go使用包来组织源代码,Go语言没有强制要求包名必须和其所在的目录名同名,但是建议包名和所在目录名同名,包借助了目录树的组织方式。
-
包的导入:包名是从
GOPATH/src/
后开始计算的,使用/
进行路径分隔全路径导入:GOROOT/src后开始写
包命名别名:
import F "fmt"
省略引用格式:
import . "Fmt"
引用时直接使用Println()
匿名引用:只是希望执行包初始化的init 函数,而不使用包内部的数据时,可以使用
import _ "net/http"
包加载:在执行main包的main函数之前,go引导程序对整个程序的包进行初始化。从main函数引用的包开始,逐级查找包的引用,直到找到没有引用其他包的包,最终生成一个包引用的有向无环图。然后将图转化为一棵树,从树的叶子节点逐层向上对包进行初始化。单个包初始化时,先初始化常量,然后全局变量,最后执行init函数。
-
使用 export 指令可以将当前目录的值设置到环境变量 GOPATH中。
export GOPATH=
pwd
建立gopath中的源码目录:mkdir -p src/hello
编译和运行:
go install hello
bin目录下执行./hello
GOPATH路径建议随项目路径设置,避免不可预知的错误
-
功能常用内置包
- fmt io
- bufio 对io包的封装,并提供了缓冲数据功能
- sort
- strconv 字符串和基本数据类型之间转换
- sync 实现中锁机制和其他同步互斥机制
- flag 命令行参数规则定义和解析
- encoding/json 对象《=》JSON字符串间转换
- html/template 主要实现了 web 开发中生成 html 的 template 的一些函数
- net/http
- ox/exec linux命令相关实现
- reflect
- bytes log
-
自定义包
Go 编译速度快受益于以下三点:
- 所有导入的包必须在每个文件的开头显示的声明
- 禁止包的环状依赖,包的依赖关系会形成一个有向无环图,每个包可以独立编译,且很可能会并发编译
- 编译后的文件不仅记录了本身的导出信息,目标文件还记录了包的依赖关系。因此在编译一个包时,不需要遍历所有引入的包,只需要读取直接导入的目标文件即可。
-
包中的标识符,让外部的包可以访问包的类型和值
type MyStruct struct { OutPackage int // 包外可用 innerPack string // 包内访问 } type MyInterface interface { ExportedMethod() // 包外 innerMethod()// 包内 }
网友评论