Go 结构体嵌套 “继承”

嵌套结构体 嵌套匿名结构体

//address 地址结构体

type address struct {

  province string

  city string

}

//user 用户结构体

type user struct {

  name string

  gender string

  //addr address //结构体嵌套,访问 user1.addr.city

  address //可以用匿名嵌套结构体(推荐), 访问user1.city或user1.address.city(名称冲突时用) 写成" *address " 表示指针

}

func main() {

  user1 := user{

    name: "小王子",

    gender: "男",

    address: address{ // 写"&address" 返回地址,上面定义时要用指针接收

      Province: "山东",

      City: "威海",

    },

  }

}

模拟“继承”,

把公共的属性定义在父匿名结构体中,这样在子结构体方法和父结构体方法中都能访问该属性

//animal 动物

type animal struct {

  name string

}

//dog 狗

type dog struct {

  feet int8

  *animal //通过嵌套匿名结构体实现继承,原理是animal中的字段可以通过dog对象直接访问

}

func (a *animal) move() {

  fmt.Printf("%s会动", a.name)

}

func (d *dog) wang() {

  fmt.Printf("%s会汪汪汪...", d.name)

}

func main() {

  d1 := &dog{

    feet: 4,

    animal: &animal{ //注意嵌套的是结构体指针

      name: "乐乐",

    },

  }

  d1.wang() //乐乐会汪汪汪~

  d1.move() //乐乐会动!

}

结构体匿名字段(知道就行,很少用)

type Person struct {

string //结构体匿名字段,相同类型只能有一个,默认把类型当名字 p.string

int

}

11