正文
go语言包引用 go 包引用
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
go之包引用、"实体类"的使用套路(struct)
首先我们看下包
下面看下go里面包的创建和使用
接下来复制这个目录地址到goland的ide里面直接open这个路径地址
否则会执行失败
可以发现同包下面的文件里面的方法可以直接相互调用 不用引入包
但是我们想要在main函数里面输出我们别的包下面的方法
则如要引入相应的包
首先go里面没有public private这些关键字
但是要想在不同的包下面调用方法 需要将相应的方法名写成大写字母开头的
也就是我们写的getUser方法要改成GetUser这样才能在main函数里面调用
实例化结构体可以有很多方法(现在没学到指针)
看下如何做
首先来到UserService
4.1 Go语言中包(Packages)基础知识
先看一下目录结构,注意这里的src名称是必须的,go在设置了GOPATH后,默认会添加src去寻找package,暂未查询是否有方法不按照src查询
根据上面的描述,Go语言中通过包中函数的名称来区分公共函数和私有函数,go语言包引用我们在main函数中是无法调用myPrivateFunc的
此时如果执行通过go run方式执行,会看到如下的提示信息,这与大部分语言对于包管理方式相关,所以go语言包引用我们通过两种不同的方法来让代码执行起来
返回如下,这里面对我们后续执行有影响的两个参数GO111MODULE和GOPATH
如果要使用gopath模式引用包,则需要关闭mod模式
设置GOPATH为当前路径,即main.go所在的路径
此时再查看go env时,GOPATH已经发生改变
我们再次尝试执行代码
可以看到public函数被调用
golang中包循环依赖问题
一、go中为什么不允许循环依赖
二、如何解决循环依赖
循环依赖就是A引用B,B又引用A,形成了一个包引用的闭环。要解决循环引用,就是打破这个闭环,让A引用B,B不能引用A。看下面的例子:
包结构如下:
执行main函数报错:
报错的原因是 我们在执行bagA.PrintA()的时候,引用了A包,A包又引用了B包,B包又引用了A包,形成了循环依赖。那我们打破依赖就可以了。
那么该怎么打破呢?
我们发现A包引用B包,是因为A包需要调用B包的bagB.GetName()方法;同样的,B包引用A包,是因为B包需要调用A包的bagA.GetName()方法。那么,我们有没有不需要引包就能使B包可以调用A包的方法呢?
当然是有的。看下面:
我们在B包里定义了一个方法变量AHandler,并且提供了为这个方法变量赋值的方法Register(),然后在A包里的init()方法里,调用B包的Register()方法,将A包的GetName方法复赋值给了AHandler变量。 这样,在B包执行方法AHandler是不是就相当于调用了A包的GetName方法呢?看执行结果:
总结:
上述解决办法的核心逻辑就是,B包使用一个方法变量来替代A中的方法(来完成B不引用A),A来为该变量赋值(因为A引用B,A可以调用B的方法来完成赋值)。 解决循环依赖问题,思想就是打破包的循环依赖,以不导包的方式调用其他包的方法。所以,采用接口的形式也可以解决循环依赖(B定义一个接口,A中你想要调用的方法实现了该接口,A中完成接口变量赋值,B来调用接口方法,有时间再补充例子吧)
关于go语言包引用和go 包引用的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。