快速解决方案
- 强制开启GO111MODULE
go env -w GO111MODULE=on
- 使用中国代理
go env -w GOPROXY=https://goproxy.cn,direct
如果使用了上面两个命令还是无法解决你的问题,或者你想知道为什么要使用这两个命令,强制开启GO111MODULE到底有什么用,看完这篇博客应该就了解了。
GO111MODULE介绍
GO111MODULE开启和关闭对Go的包无论是导入,还是下载使用,都有着非常大的区别,老版本可以说就没有包管理器,无法实现类似npm install
或者pip install -r requirements
这样的自动导入所有需要的包。并且go项目也被限制在了go的PATH文件夹中,导入也需要写较长的路径,十分不方便。GO111MODULE的出现就是用来解决上述所有的问题。
GO111MODULE出现后
使用区分
确保你的go版本大于1.11go version
(最好大于1.13),否则是没有GO111MODULE这个模块的。
- 查看当前项目是否启用了新版包管理器:
看一个Go项目中有没有go.mod
文件是区分这个go项目是否使用了新版包管理器的关键! - 查看本地是否启用了新版包管理器
在命令行输入go env GO111MODULE
查看当前状态,其中自动(auto)的规则在go的1.13版本之后是扫描文件夹中是否存在go.mod
文件,如果存在则启用,不存在则关闭。
旧版使用
说新版之前,我们先来看看如果纯使用旧版有多麻烦旧版因为不能换源,在国内很容易出现一些问题,先不说GitHub时不时连不上,golang.org是一定连不上的,一旦出现需要从golang.org下载的包必然报错
安装库
旧版命令很少,基本上我们用的也就是安装包时候的命令go get 包下载地址
,这里我用logrus
日志库在做演示,我输入
go get github.com/sirupsen/logrus
解决无法下载
- 无法下载:
老版本这种命令行下包老容易出现一些奇奇怪怪的问题,比如下面这样的,虽然logrus下载成功了,但是基于logrus包的
首先根据报错我们得知,是golang.org/x/sys/windows
下载失败导致的,并且我们尝试运行logrus库的时候也的确提示了缺少这么一个包。
解决办法:
- 开启全局代理(当前主流的代理软件比如下面截图中那些,都是基于socket5的他们的全局都是假全局)。使用socket5实现真全局代理是手机上开代理并且热点共享代理,然后在电脑连接手机热点,这样是真正的全局代理了。
- 手动下载需要的包放到指定的位置,一般go的包都会开源在GitHub上,所以只需要去下载相应的包即可(go官方git地址: https://github.com/orgs/golang/repositories)
根据报错提示,我需要的是sys
这个包,我只需要拉去https://github.com/golang/sys
即可
我是自己使用git clone克隆下来了,你也可以手动下载放进去,注意吧文件名改成一样的即可。
我这只是安装了一个日志库就如此麻烦,如果是一个较大的项目肯定不止一个日志库,那下载包就会占用我们大量时间!
不过老版也有一些Glide
第三方的包管理工具,不过我如go比较晚,因为有了官方的包管理工具就没用过这些工具了。想要了解的话可以了解一下据说在中国用的比较多的:Glide: https://glidedocs.readthedocs.io/zh/latest/
新版使用
旧版不支持换源是导致他下载非常麻烦的一大因素,在国内我们无论是使用Python的pip,还是nodejs的npm,甚至是很多Linux发行版都会优先换个源在使用。GO111MODULE首先解决了这个不能还原的问题。所以在使用新版包管理器前建议你先进行一下换源。
- 七牛 CDN
go env -w GOPROXY=https://goproxy.cn,direct
- 阿里云
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
- 官方
go env -w GOPROXY=https://goproxy.io,direct
网上比较流行使用的多的是七牛的,三选一即可,可以都试试看在你的网络环境下谁快
这个换源命令只有在使用新的包管理器时才会生效
初始化
使用新的包管理器之前,我们先要对go项目进行一次初始化,也就是生成go.mod
文件,这个文件在之前也说过就是区分是否使用了新版包管理器的关键。
go mod init 项目名
PS:项目名不支持中文,中文会报错
老项目初始化
老项目中如果有:vendor/
(第三方包管理工具:Glide)文件夹,将其中的文件(glide.yaml和glide.lock, 也有可以是其他的包管理工具)移动到你需要初始化项目的根目录,在使用go mod init 项目名
会自动处理成新模式。
详细用法可以看go官方社区的说明:https://learnku.com/docs/go-blog/migrating-to-go-modules/6477
安装库
这里我将那一个go的代码审计工具gosec: github.com/securego/gosec
和go日志来示范logrus: github.com/sirupsen/logrus
新版安装库是有两种命令的,他们负责应对不同的情况,go install
这个命令建议安装那些有主文件(main.go
),下载下来是作为一个xxx.exe存在于bin目录下的,而go get
一般用来下载我们项目中调用某个库时使用的命令。(https://segmentfault.com/a/1190000038541867)
使用go install
需要注意,必须要在最后加上@版本号
,如果想用最新版直接输入@latest
即可
-
go install github.com/securego/gosec/v2/cmd/gosec@latest
这个命令会下下载需要的库放在pkg目录中,然后在自动生成可执行文件放在bin目录中,之后我们可以用个命令行直接调用下载的这个包。这个命令并不会对我们的go.mod
产生影响。
-
go get -u github.com/sirupsen/logrus
执行这步后会自动拉去我们所需要的各种库,并且会将这些依赖添加到go.mod文件夹中。
(PS: 这里的-u
作用是如果本地已有相关版本则比对本地版本,如果版本不是最新的则下载最新版本到本地使用,如果没有-u
的话并且本地已有吃包了就会直接使用本地的包。)
但有时候加上u会报错,可以尝试去掉-u,之前就碰到过下载gin的时候官方给的go get -u github.com/gin-gonic/gin
使用时就报错,但是不加u就好了,不过你可以尝试加个-v查看具体的下载进度go get -v github.com/gin-gonic/gin
-
go get ./...
这个命令会自动将整个项目需要的所有库安装上,类似于yum install
或者pip install -r requirements
的作用
项目获取完成后推荐在使用: go mod tidy
把不需要的库自动删除并整理一下go.mod
文件。
go mod命令介绍
命令 | 说明 |
---|
download | 下载依赖包 |
edit | 编辑go.mod |
graph | 打印模块依赖图 |
init | 在当前目录初始化mod |
tidy | 拉取缺少的模块,移除不用的模块 |
vendor | 将依赖复制到vendor下 |
verify | 验证依赖是否正确 |
why | 解释为什么需要依赖 |
调用库
和大多数语言一样,都是使用 import导入,但是如果使用的是旧版包的话,需要写的路径就是从go的path
路径下的src路径开始写,不过旧版有个好处就是支持中文路径,新版包管理器如果写了带中文的路径就会报错。
我当前文件的路径是go的PATH目录/src/go_test/异常处理与文件读取/文件读写/logs/Logrus_test
其中有个文件内容是:(这里导包和文件名关系不大,啥名字都行)
package Logrus_test
import (
log "github.com/sirupsen/logrus"
)
func init() {
log.WithFields(log.Fields{
"日志": "内容",
}).Info("测试日志。")
}
如果我们需要导入自己写的包而不是外部包,如果你没用GO111MODULE,就需要写这个包在src目录下的绝对路径。PS:这里的_是指,只导入不调用。我演示的时候这样写比较方便。
package main
import (
_ "src/go_test/异常处理与文件读取/文件读写/logs/Logrus_test"
)
func main() {}
而如果使用了GO111MODULE则只需要写相对路径,我这里是在logs目录下初始化的所以只需要写下面这样的路径即可,并且如果使用了这个模式,我们go的项目也不需要放到src目录下了,我们可以放到电脑任意的位置上!
package main
import (
_ "logs/Logrus_test"
)
func main() {}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)