go语言中结构体的继承(组合)详细讲解

在go中,结构体的继承是通过嵌入来实现的吗?

不是。 Go 没有继承 ,结构体嵌入本质上是一种 组合 ,
只是它恰好能"模拟"出类似继承的效果。
也就是说:go没有继承,只有组合。

通过结构体嵌套实现继承(1)

我们想用A结构体来继承B结构体的所有字段,
我们可以通过组合B来实现。
最后通过 %#v 打印出A结构体的所有字段,

package main
import (
	"fmt"
)
type Address struct {
	City  string
	Phone string
}
type User struct {
	Name string
	Age  int
	// 通过组合实现继承的效果,
	// 这样这个User结构体就包含了Address结构体的所有字段
	Address Address
}

func main() {
	// 实例化结构体
	user := User{
		Name: "张三",
		Age:  18,
		Address: Address{
			City:  "xxx城市",
			Phone: "13800000000",
		},
	}
	fmt.Printf("结构体User: %#v\n", user)
}

输出:
结构体User: main.User{Name:"张三", Age:18, Address:main.Address{City:"xxx城市", Phone:"13800000000"}}

给结构体添加方法的语法

func (变量 变量类型) 方法名(参数列表) 返回值类型 { ... }

这个变量的类型通过是结构体

通过结构体的嵌套实现继承(2)

现在我们想给A结构体添加一个方法,用于输出A结构体的所有字段。
让B结构体继承A结构体的字段和方法。同时B结构体也有自己的方法。

package main

import (
	"fmt"
)

type Animal struct {
	Name string
}

// 给Animal结构体添加一个方法Say,用于输出动物的名称
// 这样Animal结构体就有了自己的字段和方法
func (a Animal) Say() {
	fmt.Printf("我是%s\n", a.Name)
}

type Dog struct {
	Age int
	// 通过组合实现继承的效果,
	// 这样这个Dog结构体就包含了Animal结构体的所有字段和方法
	Animal
}

// 给Dog结构体添加一个方法wang
func (d Dog) wang() {
	fmt.Println("汪汪汪")
}

func main() {
	dog := Dog{
		Age: 1,
		Animal: Animal{
			Name: "旺财",
		},
	}
	dog.Say()
	dog.wang()
}

输出:
我是旺财
汪汪汪

posted @ 2026-10-24 12:25  何人陪我共长生  阅读(9)  评论(0)    收藏  举报