废话不说,直接上代码


type A struct {
	m_a string
}

type B struct {
	A
	m_b string
}

type C struct {
	B
	m_b string
	m_c string
}

func (a *A) showA() { fmt.Println(a.m_a)}
func (b *B) showB() { fmt.Println(b.m_b)}
func (c *C) showB() { fmt.Println(c.m_b)}
func (c *C) showC() { fmt.Println(c.m_c)}

func main() {
	c := C{m_b: "c-b",m_c: "c-c",}
	c.B.m_b = "b-b"  // 此处如果屏蔽,则c.B.showB()打印为空字符串
	c.m_a = "c-a"
	c.A.showA()
	c.showA()
	c.A.m_a = "a-a"
	c.A.showA()
	c.showA()
	c.B.showB()
	c.showB()
}

运行结果依次是

c-a
c-a
a-a
a-a
b-b
c-b

由此可以看出,结构体继承时,可以直接使用c.showA()或c.showB()来访问继承下来的属性,且B与A中的属性依然保存,可以通过c.A.showA()和c.B.showB()来访问,且与c中的数据单独存放