快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

go语言引用包 go 引用本地包

golang中包循环依赖问题

一、go中为什么不允许循环依赖

成都创新互联是一家专业提供花溪企业网站建设,专注与做网站、网站设计、H5建站、小程序制作等业务。10年已为花溪众多企业、政府机构等服务。创新互联专业网站设计公司优惠进行中。

二、如何解决循环依赖

循环依赖就是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语言中包的问题

你需要设置 GOPATH 环境变量

你 main.go 中需要 import 相应包

你 调用处需要带上包前缀,比如 tempconv.FToC

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"

)

献给被折磨许久的小伙伴们。。。

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 引用本地包
分享链接:http://6mz.cn/article/hhesse.html

其他资讯