package main
import "fmt"
type myType struct {
string
}
func main() {
obj := myType{"Hello World"}
fmt.Println(obj)
}
结构中无名字段的用途是什么?
是否可以像使用命名字段一样访问这些字段?
答案 0 :(得分:9)
请参阅" Embedding in Go ":您嵌入了anonymous field in a struct:这通常与嵌入式结构一起使用,而不是像string
这样的基本类型。那种类型没有"推广的领域"揭露。
如果
f
是表示该字段或方法的合法选择器,则结构x
中匿名字段的字段或方法x.f
称为已提升f
。提升字段的作用类似于结构的普通字段,除了它们不能用作结构的复合文字中的字段名称。
(此处string
本身没有字段)
在" Embeddding when to use pointer"。
中查看类型嵌入的示例是否可以像使用命名字段一样访问这些字段?
fmt.Println(obj.string)
将返回Hello World
而不是{Hello World}
。
答案 1 :(得分:5)
不尊重所选择的答案,但这并没有为我澄清概念。
发生了两件事。首先是匿名字段。第二个是“提升”字段。
对于匿名字段,您可以使用的字段名称是类型的名称。第一个匿名字段是“提升的”,这意味着您在结构上访问的任何字段都会“传递”到提升的匿名字段。这显示了两个概念:
package main
import (
"fmt"
"time"
)
type Widget struct {
name string
}
type WrappedWidget struct {
Widget // this is the promoted field
time.Time // this is another anonymous field that has a runtime name of Time
price int64 // normal field
}
func main() {
widget := Widget{"my widget"}
wrappedWidget := WrappedWidget{widget, time.Now(), 1234}
fmt.Printf("Widget named %s, created at %s, has price %d\n",
wrappedWidget.name, // name is passed on to the wrapped Widget since it's
// the promoted field
wrappedWidget.Time, // We access the anonymous time.Time as Time
wrappedWidget.price)
fmt.Printf("Widget named %s, created at %s, has price %d\n",
wrappedWidget.Widget.name, // We can also access the Widget directly
// via Widget
wrappedWidget.Time,
wrappedWidget.price)
}
输出为:
Widget named my widget, created at 2009-11-10 23:00:00 +0000 UTC m=+0.000000001, has price 1234
Widget named my widget, created at 2009-11-10 23:00:00 +0000 UTC m=+0.000000001, has price 1234```