根据这个doc
type Point struct { X, Y float64 _ struct{} // to prevent unkeyed literals }
For
Point{X: 1, Y: 1}
everything will be fine, but forPoint{1,1}
you will get a compile error:
./file.go:1:11: too few values in &Pointer literal
然后我在另一种数据类型_ byte
和_ func()
中进行了尝试,如下
type Pointer struct {
X, Y int
//_ byte // to prevent unkeyed literals
//_ func() // to prevent unkeyed literals
}
它们都可以防止未加密的文字。它如何防止未键入的文字? _ struct{}
效率更高吗?
最佳答案
无键结构要求您指定所有结构键;如果您没有指定 Y
的值,则会出现错误,例如:
type Point struct {
X, Y float64
}
_ = Point{1}
// Output:
// ./main.go:8:8: too few values in Point{...}
_ struct{}
字段确实不会阻止来自同一包的未键入文本,但您仍然可以这样做:
type Point struct {
X, Y float64
_ struct{} // to prevent unkeyed literals
}
_ = Point{1, 2, struct{}{}}
// Ugly and weird, but valid!
但是为了能够从其他包的结构字段中分配值,它们需要“导出”,即以大写字母开头,而 _
则不然,所以这个是一个错误:
_ = x.Point{1, 2, struct{}{}}
// Output
// ./main.go:6:28: implicit assignment of unexported field '_' in x.Point literal
_
没有什么特别的;您也可以使用不以大写字母开头的任何其他内容,例如 noexport struct{}
或诸如此类。
为什么是 struct{}
而不是 byte
或 int
?嗯,这些类型分配一定量的内存;对于 int
来说,它通常是 8 个字节(或 32 位系统上的 4 个字节),而 byte
是 uint8
的别名,并分配一个字节。
struct{}
是“空”类型(您不能为其分配任何内容)并且不会使用任何内存。这是一个非常小的优化,但如果您要输入一些内容,不妨输入 struct{}
。
这一切值得吗?我认为不是;如果有人想在您的库中使用未加密的结构文字,那么这就是他们的选择。许多 lint 工具已经对此发出警告,包括内置的 go vet
:
$ go vet main.go
./main.go:8:6: net/mail.Address composite literal uses unkeyed fields
关于go - 未加密文字预防如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65720669/