多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
> 本章主要介绍下`go语言包名规则` [TOC] ## 主包 > 主包:包名为 main,多个go文件可以公用main包,但只有1个文件拥有main() 执行入口函数 ``` // 主包 package main import "fmt" // 入口函数 func main() { fmt.Println("程序执行入口") } ``` ## 定义包 > 我们可以定义自己的包,通常情况,我们的包名是包所在路径的最后一个目录名,例如:service/order 路径,那么我们包名就是order > 如文件`service/order/pay.go` ``` package order // 定义常量 // 支付宝支付类型 const ORDER_TYPE_ALIPAY = 1 // 微信支付类型 const ORDER_TYPE_WECHAT = 2 // 定义PayOrder结构体类型 type PayOrder struct { Id int Price float64 } ``` ## 导入包 > 无论是导入内部包还是github上的第三方包,都是保存在GO工作空间里的(上一章开发环境有介绍),路径为`$GOPATH/src/` > 导入单个包 ``` import "包名" ``` > 导入多个包 ``` import ( "包名1" "包名2" ) ``` > 例子 ``` package main import ( // 导入我们自定义的包order "tizi/service/order" "fmt" ) func main() { // 使用order包中定义的结构体 o := order.PayOrder{} o.Id = 100 o.Price = 12.6 fmt.Println(o) } ``` ## 引用包成员 > 通过包名和点( . ) 可以引用包里面定义的成员, 成员指的是包里面定义的函数、类型、变量、常量 ``` package main import ( // 导入我们自定义的包order "tizi/service/order" "fmt" ) func main() { // 引用包中常量 fmt.Println(order.ORDER_TYPE_ALIPAY) // 引用包中结构体 o := order.PayOrder{} o.Id = 100 o.Price = 12.6 fmt.Println(o) } ``` ## 包成员的可见性 > 可针对包中的进行控制,如 结构体、结构体字段、函数、变量、常量 > * 首字母大写,代表public,外部可以引用 > * 首字母小写,代表private,外部不可以引用 ``` package order // 支付宝支付类型 const ORDER_TYPE_ALIPAY = 1 // 微信支付类型 const ORDER_TYPE_WECHAT = 2 // 定义PayOrder结构体类型 type PayOrder struct { Id int price float64 // 首字母小写,包外部无法访问这个字段 } // 首字母小写,是私有方法,包外部无法引用 func getOrderInfoById(id int) { } ``` ## 包管理工具 (go.mod) > 通常第三方包存放在`$GOPATH/src/`下,相当于所有项目都共享第三方包,但是如果另外一个同事通过git下载项目,但是自己的开发环境 ($GOPATH/src/) 没有这些第三方包,就无法正常运行程序 > 解决办法则是使用 **go mod管理第三方依赖包** ``` # 启用 Go Modules 功能 go env -w GO111MODULE=on # 切换到项目目录 cd $GOPATH/src/myproject # 初始化 go.mod管理文件 go mod init ``` > go.mod 创建好了后,以后执行以下命令,都会自动分析源码依赖,安装缺少的依赖包 ``` // 运行程序 go run main.go // 构建项目 go build ```