golang 的 package 总结

原创 学习 GO
阅读数: 693 2021年06月16日

golang 的 package 和PHP的组织方式不同,很不适应,总结记录已备回忆。


golang的package的特点:

1、go 的 package不局限于一个文件,可以由多个文件组成

组成一个package的多个文件,编译后实际上和一个文件类似,组成包的不同文件相互之间可以直接引用变量和函数,不论是否导出;

因此,组成包的多个文件中不能有相同的全局变量和函数(除了 init 函数)


对比PHP:虽然一个文件夹可以定义成一个命名空间(namespace),但是里面不同文件(class)是单独的,类里面 method 可重复。


2、go 不要求 package 的名称和所在目录名相同,但是你最好保持相同,否则容易引起歧义。

因为引入包的时候,go 会使用子目录名作为包的路径,而你在代码中真正使用时,却要使用你 package 的名称

【short_url/controllers/test/index.go】
package controllers_test

import (
	beego "github.com/beego/beego/v2/server/web"
)

type IndexController struct {
	beego.Controller
}

func (this *IndexController) Get() {
	this.Data["json"] = map[string]interface{}{"name": "astaxie"}
	this.ServeJSON()
	//this.StopRun()
}


【short_url/routers/router.go】
package routers

import (
	//根据目录地址导入 package
	"short_url/controllers/test"

	beego "github.com/beego/beego/v2/server/web"
)

func init() {
	//根据 package 名称使用包
	beego.Router("/test/index/index", &controllers_test.IndexController{}, "get:Get")

}


3、每个子目录中只能存在一个package,否则编译时会报错。

4、go的package是以绝对路径GOPATH来寻址的,不要用相对路径来import


每个package中应该是每个 init 都会被调用,且顺序固定

1、对同一个go文件的init()调用顺序是从上到下的;

2、对同一个package中不同文件是按文件名字符串比较“从小到大”顺序调用各文件中的init()函数;

3、对不同的package,如果不相互依赖的话,按照main包中"先import的后调用"的顺序调用其包中的init();

4、如果package存在依赖,则先调用最早被依赖的package中的init();


phpriji.cn | 网站地图 | 沪ICP备17015433号-1