Golang结构体内嵌字段

组合

  • 使用type定义的新类型不会继承原有类型的方法,有个特例就是命名结构类型,命名结构类型可以嵌套其他的命名类型的字段,外层的结构类型是可以调用嵌入字典类型的方法,这种调用既可以说显式的调用,也可以是隐式的调用。
内嵌字段的初始化和访问
  • struct的字段访问使用点操作符’.’,struct的字段可以嵌套很多层,只要内嵌的字段是唯一的即可,不需要使用全路径进行访问。
  • 在struct的多层嵌套中,不同嵌套层次可以有相同的字段,此时最好使用完全路径访问和初始化。在实际数据结构的定义中应该尽量避开相同的字段
  • 例:
package main

import "fmt"

type X struct {
	a int
}

type Y struct {
	X
	b int
}

type Z struct {
	Y
	c int
}

func main()  {
	x := X{a:1}
	y := Y{
		X:x,
		b:2,
	}
	z := Z{
		Y:y,
		c : 3,
	}
	fmt.Println(z.a,z.Y.a,z.Y.X.a) //输出:1 1 1
	z = Z{}
	z.a = 2
	fmt.Println(z.a,z.Y.a,z.Y.X.a)//输出:2 2 2 
}
内嵌字段的方法调用
  • struc类型方法调用也使用点操作符,不同嵌套层次的字段可以有相同的方法,外层变量调用内嵌字段的方法时也可以像嵌套字段的访问一样使用的简化模式。如果外层字段和内层字段有相同的方法,则使用简化模式访问外层的方法会覆盖内层的方法。
  • 不推荐在多层的struct类型中内嵌多个同名的字段;但是并不反对strcut定义和内嵌字段同名方法的用法,因为这提供了一种编程技术,使得struct能够重写内嵌字段的方法,提供面向对象编程中子类覆盖父类的同名方法的功能。
  • 例:
package main

import "fmt"

type X struct {
	a int
}

type Y struct {
	X
	b int
}

type Z struct {
	Y
	c int
}

func (x X)print()  {
	fmt.Printf("In X,a=%d\n",x.a)
}
func (x X)Xprint()  {
	fmt.Printf("In X,a=%d\n",x.a)
}
func (y Y)Xprint()  {
	fmt.Printf("In Y,a=%d\n",y.b)
}
func (z Z) print() {
	fmt.Printf("In Z,c=%d\n",z.c)
	//显式的完全路径调用内嵌字段的方法
	z.Y.print()
	z.Y.X.print()
}
func main()  {
	x := X{a:1}
	y := Y{
		X:x,
		b:2,
	}
	z := Z{
		Y:y,
		c : 3,
	}
	//从外向内查找,首先找到的z的print()方法
	z.print()
	//从外向内查找,最后找到的是X的Xprint()方法
	z.Xprint()
	z.Y.Xprint()
}
输出:
In Z,c=3
In X,a=1
In X,a=1
In Y,a=2
In Y,a=2
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值