最近学习区块链,在使用Go语言的过程中遇到本地包之间相互调用的问题,问题分为两个阶段:
1.如何调用本地包(参考文章:https://blog.csdn.net/taoerchun/article/details/104827702):
Golang在1.11版本后加入了新特性go modules,它是Golang的官方包管理工具。常用的命令有:
go mod init modulename //初始化模块,其中modulename一般为文件夹名。该步骤生成go.mod文件,其中记录了所依赖的包
go mod tidy //该步生成了go.sum文件,具体好像是检查包是否被更改过,里面存储了一些哈希值。
go mod vendor //该步骤将依赖包复制到vendor文件夹下,不是必须步骤
当我们要调用本地包时,需要更改go.mod文件,并重新生成go.sum文件。本地包也分为两种情况:
情况一:在同一个项目(文件夹)下,
test ├── go.mod ├── main.go └── util └── util.go
此时如果想要在main.go中导入util.go并使用其中的函数,直接导入即可(注意,此时已经使用go mod init test命令生成了go.mod文件):
import ( "test/util" // 导入同一项目下的util包
)
情况二:在不同项目(文件夹)下,
├── test │ ├── go.mod │ └── main.go └── util ├── go.mod └── util.go
这时候,util也需要使用go mod init util 命令进行初始化并生成go.mod文件。想要在main.go中调用util包,需要在test的go.mod文件中指明路径:
module test go 1.20
require "util" v0.0.0 //指明依赖包和版本号 replace "util" => "../util" //将util包替换为本地路径下的文件,如果直接使用相对路径golang会报错,所以使用这样的方法替换
然后再main.go中导入即可:
import ( "util" //直接使用go.mod中require使用的包名即可,不需要再考虑路径 )
2.如何嵌套调用本地包(参考文章:https://blog.csdn.net/hejingdong123/article/details/124147043):
当我尝试嵌套调用本地包时,按照上面的操作方法遇到了error,大概意思是找不到嵌套的第二个包。例如:
main.go需要调用db.go中的函数,而db.go又需要调用util.go中的函数。这种情况下,在db包的go.mod中按照上述1的方法调用util.go是能够成功的,但是当在main.go中调用db.go时却会报错,提示找不到util包。此时正确的调用方法如下:
(1)db文件夹下的go.mod文件中按照上述1的方法加入:
module db go 1.20
require "util" v0.0.0
replace "util" => "../util"
(2)test文件夹下的go.mod文件中不但需要加入db包的路径,还需要加入嵌套调用的util包的路径:
module test go 1.20 require ( "db" v0.0.0 "util" v0.0.0 ) replace( "db" => "../db" "util" => "../util" )
然后再运行就不会报错了。
标签:调用,db,util,嵌套,test,go,Go,mod From: https://www.cnblogs.com/P201721440036/p/17265877.html