问题:
在用于 Qt 绑定的自定义 Go 结构体中,观察到某些字段具有前导下划线字符。这种做法似乎很不寻常。这些下划线在结构标签上下文中的用途是什么?
type CustomLabel struct { core.QObject _ func() `constructor:"init"` _ string `property:"text"` }
答案:
这里的前导下划线表示所谓的“空白字段”或“匿名字段”。这些字段使用空白标识符作为其字段名称,这实际上使它们无法寻址。然而,它们确实参与了结构体的内存布局。
这些空白字段通常用于填充目的。通过将后续字段与与外部系统数据布局相对应的字节或内存位置对齐,空白字段可以实现无缝且高效地转储或读取结构值。
具体用例:
在提供的示例中,下划线专门用于生成 Qt 的构造函数和属性设置方法
替代方法:
虽然匿名字段通常用于定义类型注释,但由于其相关的开销,谨慎使用它们至关重要。由于这些字段无法被引用,因此它们仍然消耗内存。使用匿名字段时应考虑这种潜在的性能影响。
相反,请考虑使用大小为 0 的类型,例如 struct{},以保持内存效率。然而,这种方法可能会带来其他性能缺陷,因为它可能需要反射来访问类型信息。
另一种方法涉及使用具有 gewünschte 类型的 0 大小数组,提供零大小占用空间和类型可访问性.
type CustomLabel struct { _ [0]func() `constructor:"init"` _ [0]string `property:"text"` }
以上是为什么在 Qt 绑定的 Go Struct 标签中使用下划线?的详细内容。更多信息请关注PHP中文网其他相关文章!