以下是效果很好的小代码段:
package main
import "fmt"
import "database/sql"
type Something struct {
Int64 int64
Valid bool
}
func main() {
var s = sql.NullInt64{1, true} // <- unkeyed fields warning
var s1 = Something{1, true}
fmt.Printf("Hello, %#v %#v\n", s, s1)
}
但是go vet
抱怨:
test.go:12: database/sql.NullInt64 composite literal uses unkeyed fields
问题是:为什么它会在第12行抱怨并且不会在第13行抱怨?
答案 0 :(得分:2)
它要求你添加密钥,例如
var s = sql.NullInt64{Int64: 1, Valid: true}
答案 1 :(得分:1)
要了解此行为,我们只需查看go vet
存储库中go.tools
的来源。
在composite.go:46
中,它会检查复合文字的类型。如果文字是当前包的一部分,go vet
不会警告您关于未键控的值。
// A simple type name like t or T does not need keys either,
// since it is almost certainly declared in the current package
此检查可能存在,因为外部包可能会更改结构字段并破坏您的代码。键控字段使这不是一个问题。