首页 > 代码库 > Embedding

Embedding

The Little Go Book http://openmymind.net/The-Little-Go-Book/ 里面介绍了 Embedding 的实现方法,

示例程序如下(有修改):

package main

import "fmt"

type Person struct {
	Name string
}

func (p *Person) Introduce() {
	fmt.Println("Hi, I‘m", p.Name)
}

type Saiyan struct {
	*Person
	Power int
}

func main() {
	goku := new(Saiyan)
	goku.Person = new(Person) // 必须先有 Person
	goku.Name = "Goku"        // 然后才有 Name
	goku.Power = 9001
	goku.Introduce()
}

  

其中,特别需要注意的是,虽然 goku 可以“免费”获得 Person 的全部能力(比如 .Name 和 .Introduce() ),但前提是必须先给 goku.Person 赋值。如果删掉那句 goku.Person = new(Person) 

即,变成这样:

func main() {
	goku := new(Saiyan)

	goku.Name = "Goku" // 此时,还没有 goku.Name
	goku.Power = 9001
	goku.Introduce()
}

  那么,就会产生 panic: runtime error

 

Embedding