ARM|Golang 1.17,新功能介绍( 二 )


gomodgraph子命令也支持-go标志 , 这会使得报告所指示的Go版本所看到的图表显示可能存在的依赖关系 , 否则会被精简 。
模块弃用评论
模块作者可以go.mod中添加// Deprecated: comment弃用一个模块 , 然后标记新版本 。 go get如果模块需要 , 现在打印警告 , 不建议在命令行上命名的构建包 。 go list -m -u会打印所有弃用的依赖项(-f或者-json显示完整信息) 。 go命令基于不同的主版本区别不同模块 , 因此可以使用此机制 , 例如 , 提供具有一个新的主版本迁移的用户说明 。
go get
go get -insecure标志已被删除 。 必需使用不安全的折衷方案获取依赖项时 , 需要设置GOINSECURE环境变量 。 -insecure标志也被用于绕过模块的sum校验 , 对于该用途 , 可以使用GOPRIVATE或者GONOSUMDB 。
go get非主模块执行安装操作时打印弃用警告的命令(没有加-d选项) 。 应该使用go install cmd@version安装特定版本 , 可以使用如@latest或者@v1.2.3的后缀 。在Go 1.18 中 , -d 标志将默认启用 , 并且go get仅用于更改依赖项go.mod 。
go.mod文件缺少 go指令
如果主模块的 go.mod文件不包含一种go指令并且go命令无法更新go.mod文件 , go命令为假定go版本为1.11而非当前版本 。( 在go1.12中go mod init会自动添加go指令 。 )
如果模块依赖缺少显式的go.mod文件 , 或 其go.mod文件不包含go指令 , go命令现在假定go版本为1.16而非当前版本 。
有关vendor内容
如果主模块指定go 1.17或其后版本 , gomodvendor现在注释 vendor/modules.txt go版本 , 每个供应商模块都有自己的go.mod文件 , 当从供应商的源代码构建模块的包时会注释go版本 。
如果主模块指定go 1.17或其后版本 , go mod vendor现在省略go.mod和go.sum供应商依赖项的文件 , 否则可能干扰其go命令来识别正确的模块根目录调用vendor树 。
密码提示
当使用SSH获取Git存储库时 , go命令现在默认禁止SSH密码提示和Git Credential Manager提示 。 用户访问带有受密码保护的SSH私有Git存储库可以配置ssh-agent , 让go命令访问受密码保护的SSH密钥 。
go mod download
go mod download调用时未指定参数 , 将不再将下载的模块的sum值保存到 go.sum 。 可能仍然对go.mod和go.sum需要加载构建列表 。 这与Go 1.15中默认行为一致 。 要保存所有模块的sum值 , 可使用
go mod download all
//go:build行
go命令现在可以理解//go:build行并且用来取代//+build行 。 新语法使用布尔表达式 , 更不容易出错 。 从1.17版本开始 , 新的语法被完全支持 , 所有的Go文件应该更新为具有相同含义的两种形式 。 为了帮助用户迁移 , gofmt现在自动 同步两种形式 。
go run
go run现在接受带有版本后缀的参数 (例如 ,go run example.com/cmd@v1.0.0) 。这使go run在模块感知模式下构建和运行包 , 忽略go.mod当前目录或任何父目录中的文件 。 对于运行可执行文件而无需安装它们或无需更改当前模块的依赖项 。
gofmtgofmt(和go fmt) 现在同步//go:build行与//+build行 。 如果一个文件只有//+build行 , 它们将被移动到适当的文件中的位置 , 并匹配添加//go:build行 。否则 , //+build行将基于现有的//go:build行调整 。
Vet//go:build行和 //+build行不匹配的新警告
vet工具现在可以验证//go:build和//+build行位于文件的正确部分 , 并且彼此匹配 。 如果不匹配 , gofmt可以用来修复它们 。
signal.Notify在无缓冲通道上 的调用告警
Vet 工具现在对调signal.Notify输入信号被发送到一个无缓冲的通道时发出警告 。 signal.Notify不阻塞时使用无缓冲通道会有丢失发信号的风险 。例如:
c := make(chan os.Signal)
//在channerl读取之前已经发出时候 , 该未缓冲的信号c会被丢失

相关经验推荐