1、go引入包的链接用“github.com”还是“gorm.io”?
建议用新版本,即从gorm.io引入!
老版本:Gorm v1-v1.9.16,从 github.com 导入:
import (
...
"github.com/jinzhu/gorm"
)
新版本:v2及以后,从 gorm.io 导入:
//Go 约定是,当新的包版本不再向后兼容时,导入路径应该改变,因此在推出版本 2 时,
//团队决定将 repo 移到 github 上的一个新组织:https://github.com/go-gorm/gorm ,
//并且这个新版本使用 gorm.io/gorm 导入到您的代码中:
import (
...
"gorm.io/gorm"
)
(请记住,由于 go 生态系统中的怪癖,v2 被标记为 >= v1.20.0,我知道这很困惑!)
Gorm v2 在语法和功能上通常与 v1 非常接近,但更强大、更一致并且已经消除了大量错误。我还没有看到基准测试,但由于使用了准备好的语句,它的性能也应该更高。
总而言之,没有理由不在新项目中使用 v2,并且有很多理由在现有项目中从 v1 迁移。
参考:
https://www.coder.work/article/7497899
https://stackoverflow.com/questions/65950373/what-is-the-difference-between-github-com-jinzhu-gorm-and-gorm-io-gorm
2、包定义 vs 包引用 vs 包内东西使用
(1)代码
// 包定义
package name // 包名
// 包引用/导入
import "project/d1/d2/name" // 格式1,常用:"项目名/包目录/包名"
import io "fmt" // 格式2,包别名:引用fmt这个包时,名字重命名为io
import _ "os" // 格式3,仅调用init不引用:引用os这个包,但是不调用,其实就是引用它的init函数
//包内东西使用
name.F1() // 包名.函数名 ,函数调用,要用`包名.`,不能直接用函数名F1()。
(2)包定义
和 包引用
时,目录层级:package定义时 包不嵌套,import引用时 文件夹嵌套
package,包定义,仅考虑直接目录。反应的是包,包均是独立的【github.com/satori/go.uuid
这种用点连接的不知道是否嵌套?】
import,包引用,要考虑嵌套的父目录。反应的是包的绝对文件夹位置,是目录层级,但并不是包的层级
包名.函数名,函数调用,要用包名.
,不能直接用函数名
例1
目录结构如下
- demo
- -d1
- -d2
- -a.go
- -b.go
- -d2
- -main.go
- -d1
import和package如下:
name | package | main如何import | main如何调用F() |
---|---|---|---|
a.go | package d2 | demo/d1/d2 | d2.F() |
b.go | package d1 | demo/d1 | d1.F() |
main.go | package main | - | - |
例2
package是包定义,直接就是独立的包名test_goroutine,没有目录。
import该包时,要用实际的目录层级项目名/文件夹层级
,即demo/test_goroutine。
调用该包内的函数Test7时,要用包名.函数名
,即test_goroutine.Test7。
3、vscode总是不更新包,画红线且报错
could not import github.com/gorilla/websocket (no required module provides package "github.com/gorilla/websocket")compilerBrokenImport
新Go Modules vs 旧GOPATH
Go在2009年发布之初没有自己的包管理器。使用go get命令把需要依赖的模块下载到$GOPATH/src目录下。此时并没有版本控制,只能下载master的版本。
Go Modules是在Go 1.11版本中引入的。此时从git上下载的依赖库不再保存在GOPATH中,而是存到当前项目中,并使用go.mod文件跟踪依赖库和其版本。GO111MODULE这个环境变量也是此时引入的,作为控制是否开启Go Modules的开关。
Go Modules和GOPATH是两个对立的依赖存储和搜索方式。
从 Go 1.16 开始,默认行为是GO111MODULE=on,这意味着如果您想继续使用旧GOPATH方式,则必须强制 Go 不使用 Go Modules 功能设置GO111MODULE=off
。
Go 1.17 于 2021 年 8 月 16 日发布。至于 1.16,GO111MODULE=on是默认行为,GO111MODULE=auto相当于GO111MODULE=on. 如果您仍想使用该GOPATH方式,则必须强制 Go 不使用 Go Modules 功能使用GO111MODULE=off
解决方案
我用上述方法不行,估计是代理配置的有问题,也可能是公司电脑的安全限制。
手动解决,有点麻烦,凑合搞定:
go mod tidy
go mod vendor
方法一(推荐):
是用go install 代替go get 下载第三方模块
方法二(不推荐):
关闭GO111MODULE配置
go env -w GO111MODULE=off
参考:
https://blog.csdn.net/counsellor/article/details/123031707
作者:西伯尔
出处:http://www.cnblogs.com/sybil-hxl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。