Go:派生类型的嵌入式字段初始化

时间:2015-10-02 11:22:20

标签: go embedding

以下是有效的代码:

package main

import (
    "fmt"
)

type Base struct {
    Field  int
}

type Derived struct {
    Base
}

func main() {
    d := &Derived{}
    d.Field = 10
    fmt.Println(d.Field)
}

这里的代码无法使用./main.go:17: unknown Derived field 'Field' in struct literal

进行编译
package main

import (
    "fmt"
)

type Base struct {
    Field  int
}

type Derived struct {
    Base
}

func main() {
    d := &Derived{
        Field: 10,
    }
    fmt.Println(d.Field)
}

这到底发生了什么?对不起,如果它很明显,但我只是不明白。

2 个答案:

答案 0 :(得分:4)

使用语言specification

  

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

这就是无法工作的原因。

以下是解决该限制的两种可能方法,每种方法都在以下函数中说明:

func main() {
    d := &Derived{
        Base{Field: 10},
    }

    e := new(Derived)
    e.Field = 20

    fmt.Println(d.Field)
    fmt.Println(e.Field)
}

答案 1 :(得分:1)

要初始化组合对象,您必须像其他任何对象一样初始化嵌入字段:

package main

import (
    "fmt"
)

type Base struct {
    Field int
}

type Derived struct {
    Base
}

func main() {
    d := &Derived{
        Base{10},
    }
    fmt.Println(d.Field)
}