GO:使用项目中文件夹里的自定义包
刚开始学习GO语言,想要在代码中使用项目文件夹中自定义的包,碰到了一些问题,已经解决了。希望能够帮助碰到同样问题的朋友。
2021.8.12更新:详细的包管理介绍还有版本控制见以下链接:
https://xie.infoq.cn/article/641f6d8632d99e6775e00bc5e
问题描述
想要在GO中尝试面向对象,在项目中建立多个包,随后通过主函数调用这些包。项目day2的文件结构如下:
在main()函数中调用string文件夹与array文件夹中的方法。
实验环境:
win10 + GO1.16
//mod文件 运行go mod init day2
module day2
go 1.16
main.go
package main
import (
"day2/array"
str "day2/string"
"fmt"
)
func main() {
fmt.Println("我是主函数中的输出")
str.Package_str()
array.Package_array()
}
错误1
could not import day2/string (cannot find package “day2/string” in any of F:\GO\src\day2\string (from $GOROOT)
F\src\day2\array (from $GOPATH)
找不到指示的包,默认模式下import的包总是在GOPATH的目录中查找,项目也需要放在GOPATH/src中。(cmd 中 go env 查看环境)
从GO1.11开始,包管理不再局限于GOPATH,可以通过mod更灵活地管理包与包版本。高版本的GO中引入了vendor属性,通过环境变量GO111MODULE控制。可以理解为这个属性控制go编译时,默认先从项目源码目录中查找代码,如果找到,则不会到GOPATH寻找。
还进一步推出包管理工具——Godep、Govendor、godm、Go Modules。
GO111MODULE的设置参数
- =auto 。自动,项目在$GOPATH/src里会使用$GOPATH/src的依赖包,在$GOPATH/src外,就使用go.mod 里 require的包
- =on 开启,go1.12后,无论在$GOPATH/src里还是在外面,都会使用go.mod 里 require的包
- =off 关闭,即为默认模式
解决方法
增加一个新的环境变量——GO111MODULE,值设置为auto或者on。允许在GOPATH外部寻找包。
此电脑—》右键,属性—》高级系统设置—》环境变量—》添加环境变量
错误2
在解决了上述错误之后,出现了另外一个错误。
could not import day2/str (no required module provides package “day2/str”)
原因是在项目中我建立了文件夹string,里面的包名是str。一开始的调用语句是:
import (
"day2/str"
"fmt"
)
以为是通过包名调用,结果找不到。经过尝试,发现需要的是文件夹名称,而文件夹中的包名一般会成为我们调用的名字。例如:
我们文件夹叫string,包名叫str,导入的时候使用day2/string,但是调用是用包名str调用——str.Package_str()。所以,为了避免出错,最好统一文件夹名称和包名。
解决方法
import (
str "day2/string"
"fmt"
)
day2/string ==> mod初始化的包名 / 调用目标的文件夹名
另外,注意导出的方法是需要首字母大写。不然会报错。
总结
如果想在GO中使用自己写的包或者尝试使用面向对象编写代码。
- 首先,在环境变量中将GO111MODULE设置为on
- 然后,在项目主目录中执行 go mod init 项目名 初始化mod
- 新建类文件夹后,在里面写package。(类对象)
- 在main.go调用是,import的路径是 : mod模块名称/项目文件夹名称(与main同级)/类文件夹名称(包的代码)/包名称;
参考:
go modules介绍:
https://studygolang.com/articles/22391
GOPATH的使用介绍:
https://juejin.cn/post/6844903808942735368