Go结构中的无名字段?

时间:2015-01-18 20:40:15

标签: go

package main

import "fmt"

type myType struct {
    string
}

func main() {
    obj := myType{"Hello World"}

    fmt.Println(obj)
}

结构中无名字段的用途是什么?

是否可以像使用命名字段一样访问这些字段?

2 个答案:

答案 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```