go - 未加密文字预防如何工作

标签 go

根据这个doc

type Point struct {
    X, Y float64
    _    struct{} // to prevent unkeyed literals
}

For Point{X: 1, Y: 1} everything will be fine, but for Point{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{} 而不是 byteint?嗯,这些类型分配一定量的内存;对于 int 来说,它通常是 8 个字节(或 32 位系统上的 4 个字节),而 byteuint8 的别名,并分配一个字节。

另一方面,

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/

相关文章:

mongodb - 在go mongodb中的From Table上进行比赛阶段

go - 如何应用 kubernetes 工作负载

go - 如何处理多个配置

go - 使用 JSON 的 POST 调用失败

go - gc 会在 Golang 中将数组设置为 nil 时收集对象吗?

go - 提供标准库 (crypto/tls)

go - 使用值创建结构实例

go - 比较不同类型的两个值(但基础类型相同)

pointers - 范围内的 golang 指针不起作用

go - golang ast遍历中如何从子节点检索父节点?