关于golang中包(package)的二三事儿

dajianshi · 2014-10-04 19:26:02 · 23327 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2014-10-04 19:26:02 的文章,其中的信息可能已经有所发展或是发生改变。

golang的package和其他语言的组织方式完全不同,刚开始接触时,很不适应。

golang的package的特点:

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

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

  因此,组成包的多个文件中不能有相同的全局变量和函数(这里有一个例外就是包的初始化函数:init函数,下面还有讨论)

2、go不要求package的名称和所在目录名相同,但是你最好保持相同,否则容易引起歧义。因为引入包的时候,go会使用子目录名作为包的路径,而你在代码中真正使用时,却要使用你package的名称。

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

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

关于package的初始化函数init的说明:(主要参考oygg2008大侠在某贴中的回复,我经过试验确实如此)

每个package中应该是每个init都会被调用,且顺序固定
1、对同一个go文件的init()调用顺序是从上到下的
2、对同一个package中不同文件是按文件名字符串比较“从小到大”顺序调用各文件中的init()函数,对于
3、对不同的package,如果不相互依赖的话,按照main包中"先import的后调用"的顺序调用其包中的init()
4、如果package存在依赖,则先调用最早被依赖的package中的init()

 


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:dajianshi

查看原文:关于golang中包(package)的二三事儿

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

23327 次点击  ∙  1 赞  
加入收藏 微博
3 回复  |  直到 2019-05-09 22:22:11
hades2013
hades2013 · #1 · 7年之前

mark ,,学习

ZhaoMingfang
ZhaoMingfang · #2 · 7年之前

学习了,刚才一个子文件夹里面两个包,一直编译不过去,现在知道问题了。

focussoft
focussoft · #3 · 6年之前

虽然已经知道了这里的要点, 还是感谢楼主的总结. 最后一个 init的顺序还真的不这么清楚, 不过 init大多数都是用来初始化一些静态的资源, 除了依赖必须先通过 init初始化之外, 本包内的调用顺序不是太重要.

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传