Go结构中的无名字段?

use*_*856 8 go

package main

import "fmt"

type myType struct {
    string
}

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

    fmt.Println(obj)
}
Run Code Online (Sandbox Code Playgroud)

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

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

dav*_*000 68

没有不尊重所选答案,但它并没有为我澄清这个概念。

有两件事正在发生。首先是匿名字段。二是“晋升”领域。

对于匿名字段,您可以使用的字段名称是类型的名称。第一个匿名字段是“提升的”,这意味着您在结构上访问的任何字段“都会传递”到提升的匿名字段。这显示了两个概念:

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)
}
Run Code Online (Sandbox Code Playgroud)

输出是:

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```
Run Code Online (Sandbox Code Playgroud)

  • 如果两个匿名字段都具有不同的字段,则所有字段都会被提升。如果两个匿名字段碰巧有一个同名字段,则该字段由于不明确而不会被提升。如果您尝试通过提升访问此类字段,则会收到“模糊选择器”编译错误。 (6认同)
  • 确实没有不尊重,并且投票。很好而且有用的例子。 (2认同)
  • 不是所有嵌入式领域都会得到推广吗?我尝试运行(https://play.golang.org/p/zB3Qgkhl84D)来自 https://medium.com/golangspec/promoted-fields-and-methods-in-go-4e8d7aefb3e3 的示例和第二个嵌入式领域也得到提升 (2认同)

Von*_*onC 12

请参阅" 嵌入Go ":您在结构中嵌入了一个匿名字段:这通常与嵌入式结构一起使用,而不是像基本类型一样string.该类型没有"推广字段"可以公开.

如果是表示该字段或方法的合法选择器,则f结构中的匿名字段的字段或方法x称为提升.x.ff

提升字段的作用类似于结构的普通字段,除了它们不能用作结构的复合文字中的字段名称.

(这里string没有字段)

请参阅" 嵌入何时使用指针 "中的类型嵌入示例.

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

A fmt.Println(obj.string)会返回Hello World而不是{Hello World}.