Go 无眼文字预防是如何工作的

Go 无眼文字预防是如何工作的,go,Go,按此 类型点结构{ 十、 Y浮动64 _结构{}//,以防止出现无眼文字 } 对于点{X:1,Y:1}一切正常,但是对于点{1,1}您将得到一个编译错误: ./file.go:1:11:指针文本中的值太少(&O) 然后我在另一个数据类型uByte和func中尝试了它,如下所示 类型指针结构{ 十、 Y整数 //_字节//以防止未指定的文字 //_func//防止未指定的文字 } 这两种方法都可以防止不可见的文字。它是如何防止无眼文字的?_ustruct{}更有效吗?无眼结构要求您指定所有结构键;

按此

类型点结构{ 十、 Y浮动64 _结构{}//,以防止出现无眼文字 } 对于点{X:1,Y:1}一切正常,但是对于点{1,1}您将得到一个编译错误:

./file.go:1:11:指针文本中的值太少(&O)

然后我在另一个数据类型uByte和func中尝试了它,如下所示

类型指针结构{ 十、 Y整数 //_字节//以防止未指定的文字 //_func//防止未指定的文字 }
这两种方法都可以防止不可见的文字。它是如何防止无眼文字的?_ustruct{}更有效吗?

无眼结构要求您指定所有结构键;如果未指定Y的值,则为错误,例如:

type Point struct {
    X, Y float64
}

_ = Point{1}

// Output:
// ./main.go:8:8: too few values in Point{...}
_uStruct{}字段并不能真正阻止来自同一个包的未指定文字,您仍然可以这样做:

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

_ = Point{1, 2, struct{}{}}
// Ugly and weird, but valid!
但为了能够在其他包的struct字段中赋值,需要导出这些值,也就是说,以大写字母开头,而uu不以大写字母开头,因此这是一个错误:

_ = 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,在32位系统上通常是8字节或4字节,byte是uint8的别名,分配一个字节

另一方面,struct{}是一个空类型,您不能为它分配任何内容,也不会使用任何内存。这是一个非常小的优化,但是如果您要键入某个内容,那么最好键入struct{}

这一切值得吗?在我看来不是;如果有人想在你的库中使用unkeed结构文字,那就是他们的选择。许多lint工具已经对此发出警告,包括内置的go-vet:


unkeed结构需要指定所有结构键;如果未指定Y的值,则为错误,例如:

type Point struct {
    X, Y float64
}

_ = Point{1}

// Output:
// ./main.go:8:8: too few values in Point{...}
_uStruct{}字段并不能真正阻止来自同一个包的未指定文字,您仍然可以这样做:

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

_ = Point{1, 2, struct{}{}}
// Ugly and weird, but valid!
但为了能够在其他包的struct字段中赋值,需要导出这些值,也就是说,以大写字母开头,而uu不以大写字母开头,因此这是一个错误:

_ = 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,在32位系统上通常是8字节或4字节,byte是uint8的别名,分配一个字节

另一方面,struct{}是一个空类型,您不能为它分配任何内容,也不会使用任何内存。这是一个非常小的优化,但是如果您要键入某个内容,那么最好键入struct{}

这一切值得吗?在我看来不是;如果有人想在你的库中使用unkeed结构文字,那就是他们的选择。许多lint工具已经对此发出警告,包括内置的go-vet:

它如何防止unkeys文本工作

未指定的结构文字必须指定所有字段;通过添加无法从包外部指定的字段,无法使用此格式,因此需要键入文字。Keyed或unkeyed是指字段名是否显示在结构文字中

结构{}是否更有效

是的,因为它的宽度为零,所以它不消耗任何内存。所有其他类型都会不必要地增加结构的内存占用

它如何防止unkeys文本工作

未指定的结构文字必须指定所有字段;通过添加无法从包外部指定的字段,无法使用此格式,因此需要键入文字。Keyed或unkeyed是指字段名是否显示在结构文字中

结构{}是否更有效


是的,因为它的宽度为零,所以它不消耗任何内存。所有其他类型都会不必要地增加结构的内存占用。

struct{}根据规范IIRC,大小为0字节,因此它似乎是更好的选择。@zangw您看到了吗:它如何防止不可见文字?-该类型是不相关的,它是防止不带关键字的文字的原因,因为具有空白标识符的字段不能从类型的包外分配,因为它是未导出的,即不是大写字母。更有效的是使用具有无键字段规则的类链接器GalangCi。所以这似乎是更好的选择。@zangw你看到了吗:它如何防止未经修饰的文字类型是不相关的,它是防止不带关键字的文字的原因,因为带有空白标识符的字段不能从类型的包外分配,因为它是未导出的,即不是大写字母。
不规则字段。不规则结构要求您指定所有结构键-不完全是,没有不规则结构。Unkeed指的是结构文字-结构值表达式,而不是结构类型本身。没有什么特别的,也不真实;这就是答案。对于这个答案来说,它足够准确@Adrian;而unkeyed struct vs unkeyed struct literal只是迂腐的:每个人都理解它的意图。关于,这只是错误的信息。无法引用名为u的字段。任何不是以大写字母开头的东西实际上都不会像uu那样表现。未指定的结构需要指定所有的结构键-不完全是,没有未指定的结构。Unkeed指的是结构文字-结构值表达式,而不是结构类型本身。没有什么特别的,也不真实;这就是答案。对于这个答案来说,它足够准确@Adrian;而unkeyed struct vs unkeyed struct literal只是迂腐的:每个人都理解它的意图。关于,这只是错误的信息。无法引用名为u的字段。任何不是以资本开头的东西实际上都不会像uu那样表现。