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
    • -main.go

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

posted on 2022-01-06 19:54  西伯尔  阅读(94)  评论(0编辑  收藏  举报