这个装go 的包真是难搞,我特么两三天装个 gin 框架都装不了。c
但是我本地是科学&联网了的。也按照主流的那写方法配置了代理之类的,但就是失败再失败
最后,直接看到一个方法是直接配置 goland 的。我就想,本地命令行都不行,ide 能行?
抱着怀疑的态度,我在 goland 上面配置了一下。出乎医疗,居然可以了
看一下步骤:
配置 goland 的 module 安装模式
生成 go.mod 文件
注意,我配置后并没有生效,运行当前程序,然后爆了个错:
贴心的 goaland 已经帮我们提示了,点击他就弹出了 go.mod 文件
安装程序文件里出现的 或者 mod require 的包
然后 goland 会直接把我们所需要的 包直接安装到 gopath/pkg/mod 文件夹下了。
可能需要手动同步下包
‘可能安装后,还是识别不了,我们需要下面这样同步一下,安装包
安装完成后,go.mod 文件里面发现多了 require (xx 包 并且后面还有 版本号,666)
其他发现
这个过程还发现一点,只要你住洞修改 mod 文件,他都会自动把你添加的 包马上下载安装了。真是方便哇。
关于 go module 文档 https://github.com/golang/go/wiki/Modules
go module 模式下,导入本地包就和使用 python import 一样简单
moduledemo和mypackage两个包,其中moduledemo包中会导入mypackage包并使用它的New方法
-
同一项目(目录)下:
moduledemo
├── go.mod
├── main.go
└── mypackage
└── mypackage.go
具体文件内容如下:
mypackage/mypackage.go:
package mypackage
moduledemo/go.mod
module moduledemo
moduledemo/main.go:
import (
"fmt"
"moduledemo/mypackage" // 导入同一项目下的mypackage包
)
- 不在同一个项目下
├── moduledemo
│ ├── go.mod
│ └── main.go
└── mypackage
├── go.mod
└── mypackage.go
mypackage也需要进行module初始化,即拥有一个属于自己的go.mod
文件内容如下:
mypackage/go.mod
module mypackage
moduledemo/main.go
import (
"fmt"
"mypackage"
)
两个包不在同一个项目路径下,你想要导入本地包,并且这些包也没有发布到远程的github或其他代码仓库地址。这个时候我们就需要在go.mod文件中使用replace指令
在调用方也就是packagedemo/go.mod中按如下方式指定使用相对路径来寻找mypackage这个包
module moduledemo
go 1.14
require "mypackage" v0.0.0
replace "mypackage" => "../mypackage" // 指定包的寻找路径
关于 mod 文件嵌套 mod 的目录结构,好像不建议这样使用 ,没意义的,因我 一个项目用一个 mod 就行了 ,其他子目录可以用 package xxx 就可以了, 引入包 就用 当前 module name/xxx 就行了
下面分享我使用 module 模式 测试的例子:
当前目录 grpc_demo 进入,执行 go mod init grpc_test
生成 下面的 go.mod 文件:
- 新建 main.go
内容如下:
package main
import (
"grpc_test/XXX"
"grpc_test/aaa"
)
XXX.Xx()
aaa.A()
新建 aaa 目录,在 aaa 下新建 a.go
package aaa
import "grpc_test/XXX"
func A(){
XXX.Xx()
}
新建 XXX 目录 , 在 XXX 目录 下新建 xx.go
package XXX
import (
"grpc_test/aaa"
)
func Xx(){
aaa.A()
}
ok ,上面的代码已经清楚的说明了, mod 模式下,一个工程项目的导入包的方式,很简答,哈哈哈
注意,上面我只是为了说明,导入包的方式, 出现了循环导入的情况,但这属于语法错误,导入包 ide 都是显示可以找到这个包的
2020 goland版本 配置 goproxy 参考:
https://bobsong.cn/1230.html
常见的问题:
mod 顶级目录下, 单文件 的package 声明 应该 是 mod module 的名字 或者 main 或者 新建目录,把文件放在里面 使用其他的 package 名字
这就有了那个问题就是: 同一个文件夹下的单文件应该属于同一个包, 她下面的子目录 包名字 可以是其他,但也同样递归的遵守这个 包名的规则。