go语言引用包 go语言引用传递

golang 遇到导入自定义包导入不进去的问题解决当尝试了网上所有方法,仍然发现在主文件.go中或者在其他地方引用自定义包时 , 自动删除导入的包的情况解决如下:
如你存放地址的包在src/xxx.com中时请通过命令行进入这个文件夹的位置
然后执行go mod init xxx.com/m/v1回车
上述的.../m/v1随便,这个是按照官方的建议这么写的方便维护版本吧?!
再次尝试引入自定义包,引用方式如下:
xxx.com/m/v1
|_test
||_test.go
|_main.go
import (
"fmt"
"xxx.com/m/v1/test"
)
献给被折磨许久的小伙伴们 。。。
golang中包循环依赖问题一、go中为什么不允许循环依赖
二、如何解决循环依赖
循环依赖就是A引用B,B又引用A,形成了一个包引用的闭环 。要解决循环引用 , 就是打破这个闭环,让A引用B,B不能引用A 。看下面的例子:
包结构如下:
执行main函数报错:
【go语言引用包 go语言引用传递】 报错的原因是 我们在执行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来调用接口方法,有时间再补充例子吧)
4.1 Go语言中包(Packages)基础知识先看一下目录结构,注意这里的src名称是必须的,go在设置了GOPATH后,默认会添加src去寻找package , 暂未查询是否有方法不按照src查询
根据上面的描述 , Go语言中通过包中函数的名称来区分公共函数和私有函数,我们在main函数中是无法调用myPrivateFunc的
此时如果执行通过go run方式执行,会看到如下的提示信息,这与大部分语言对于包管理方式相关,所以我们通过两种不同的方法来让代码执行起来
返回如下,这里面对我们后续执行有影响的两个参数GO111MODULE和GOPATH
如果要使用gopath模式引用包,则需要关闭mod模式
设置GOPATH为当前路径 , 即main.go所在的路径
此时再查看go env时,GOPATH已经发生改变
我们再次尝试执行代码
可以看到public函数被调用
关于go语言引用包和go语言引用传递的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读