博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go语言中的Package问题
阅读量:7072 次
发布时间:2019-06-28

本文共 1513 字,大约阅读时间需要 5 分钟。

 问题一、Go使用Package组织源码的好处是什么?

1.任何源码属于一个包

2.用包组织便于代码的易读和复用

 

问题二、Go语言中Package的种类

Go语言中存在两种包、一种是可执行程序的包、一种是类库函数的包。

可执行程序的包,编译完成后会生成一个可执行文件、静态库的包编译之后会生成一个.a为后缀的文件,自己不能执行只能被可执行包引用。

可执行程序的包必须以main作为包名,静态库的包名没有要求。

例如下面的实例:landlords存在如下几层结构 dal层、logic层、main以及proto层

可以看到编辑后的结果是,生成了一个db.a数据库访问的库、redis.a 缓存访问的库、logic.a 业务逻辑层的库 以及一个proto.a 协议层的库(websocket.a 是由于引用了github.com下面的包),main包最终编译成了一个可执行文件。

main包和其他类库通过静态链接,最终形成的可执行文件是没有任何外部依赖的。

补充:如何生成一个静态库的包。

打比方我创建了如下的项目,现在有这样一个包,我想要在main里面引用它。

必须使用 go install 命令,生成一下package,发现报错了。因为我没有配置gopath,所以命令报错了。

还有一个关键原因就是,我这个项目不是建立在GoPath下Src目录的,所以go install就用不了。

这也是问题的关键,就是我们在创建项目的时候,需要先配置一个GoPath加入到环境变量当中,然后里面新建三个文件夹src、pkg以及bin文件夹,然后在src下面建立自己的项目。

我把改项目,放到了一个GoPath的src目录下,重新go install之后,在对应的pkg文件夹下生成了 calc.a文件,如图所示。

 

然后我们就可以在main中引用这个包了,如下:

package mainimport (     "PackageDemo/Calc"     "fmt" ) func main(){     var a,b int = 3,1     var add = Calc.Add(a,b)    var min = Calc.Min(a,b)     fmt.Println("Add result:",add)     fmt.Println("Min result",min) }

 

问题三、包引用和init函数的执行顺序问题。

一个包引用另一个包的初始化顺序,像下面的这个流程,main引用了add包,add包引用了sub包。

是从底层还是初始化的。

 

 

package addimport (   "fmt"   "PackageDemo/sub")func init(){   fmt.Println("我是add包的init函数")}func Add(){   sub.Sub()}

  

package subimport "fmt"func init(){  fmt.Println("我是sub包的init函数")}func Sub(){  fmt.Println("")}

  

package mainimport (  "fmt"  "PackageDemo/add")func init(){  fmt.Println("我是Main里面的init函数")}func main(){   add.Add()}

结果:

我是sub包的init函数我是add包的init函数我是Main里面的init函数

 

 

转载于:https://www.cnblogs.com/dcz2015/p/10763254.html

你可能感兴趣的文章
netty实现TCP长连接
查看>>
[实战]MVC5+EF6+MySql企业网盘实战(17)——思考2
查看>>
在Mysql中怎样返回一个数据库的所有表名,列名数据类型备注
查看>>
[转载] 信息系统项目管理师视频教程——12 项目整体管理
查看>>
XAML实例教程系列 - 类型转换器(Type Converter)
查看>>
LeetCode 50. Pow(x, n)
查看>>
Action的创建和配置
查看>>
checkAll全选的一个小例子
查看>>
【转】centos关机与重启命令详解
查看>>
17.元素分类
查看>>
C语言-堆和栈
查看>>
Spring 源码解析(六)创建bean实例
查看>>
ios-xml和json的解析
查看>>
Http报头Accept与Content-Type的区别
查看>>
分析Linux内核创建一个新进程的过程【转】
查看>>
快速排序(QuickSort)
查看>>
Java8之使用Optional进行Null处理
查看>>
jsckson,想说爱你不容易啊。。。406错误
查看>>
WindowsForm 公共控件 菜单和工具栏
查看>>
真正的竞争力,是把所有人都可能拥有的东西变成财富,让沙子变成硅,这才是核心。大家都把大数据当作金矿,想要掘金。但在我看来,大数据的厉害之处是把沙子变成了硅。...
查看>>