结构体内嵌?

很基础的知识总结

结构体内嵌结构体

形式:A 结构体内有 B 结构体(并且是匿名字段的形式,相当于继承。)

作用:A 可以重写 B 的方法(也就是俗称的方法覆盖)

接口内嵌接口

形式:A 结构体内部有 B 接口,并且 B 是匿名字段的形式。

作用:A 有 B 的所有的方法,并且 A 的方法名不能 B 的方法重复但是 A 和 B 的方法类型又不同。(这一点有点问题,因为在代码中是可以这么写的)

// 可以
type Father interface {
	Name()
}

type Son interface {
	Father
	Age()
	Name()
}

type perso struct {
}

func (p perso) Age() {
	fmt.Println("perso age")
}

func (p perso) Name() {
	fmt.Println("perso name")
}

func Run() {
	var s Son = perso{}
	s.Age()
	s.Name()

}
// 可以
type Father interface {
	Name(string)
}

type Son interface {
	Father
	Age()
	Name(string)
}

type perso struct {
}

func (p perso) Age() {
	fmt.Println("perso age")
}

func (p perso) Name(string) {
	fmt.Println("perso name")
}

func Run() {
	var s Son = perso{}
	s.Age()
	s.Name("test")
}
// 不可以
type Father interface {
	Name(string)
}

type Son interface {
	Father
	Age()
	Name()
}

type perso struct {
}

func (p perso) Age() {
	fmt.Println("perso age")
}

func (p perso) Name() {
	fmt.Println("perso name")
}

func Run() {
	var s Son = perso{}
	s.Age()
	s.Name("test")
}

实现接口

形式:A 结构体实现了 B 接口的所有的方法

作用:A 接口体的实例可以赋值给 B 接口变量

var temp B=A{}

动态类型

形式:动态类型是指一个接口变量可以存储不同的实现了该接口的结构体(接口指针)的实例。

作用:如果一个函数接受多个不同的结构体实例,那么函数的参数类型就可以是接口类型。

type Person interface{
    Name()
    Age()
}

type Woman struct{}

func (w Woman ) Name(){

}
func (w Woman ) Age(){

}

type Man struct{}

func (w Man ) Name(){

}
func (w Man ) Age(){

}

func Print(p Person ){
    p.Name()
    p.Age()
}

结构体内嵌结构体+接口实现

形式:A 结构体内嵌 B 结构体,B 接口体实现了一些方法,A 既可以重写 B,如果 B 实现了 C 接口,那么这个时候,A 相当于也实现了 C 接口。

作用:通过内嵌一个匿名结构体 B,达到拥有 B 结构体的所有方法,进而间接实现B 结构体实现的接口,使得 A 可以被赋值给 C 接口变量。

结构体内嵌接口+接口实现

形式:A 结构体内嵌 B 接口,C 实现了 B 接口,当 A 接口体的 B 字段被赋值为 C 的实例,那么这个时候就是结构体内嵌结构体。但是不同在于:A 结构体的 B 字段还可以被赋值为 D 结构体实例(D 接口体实例实现了 B 接口)

作用:如果一个结构体的某个字段可以是多个不同的结构体实例,那么结构体内嵌接口就比较好。

Tags: golang
Share: X (Twitter) Facebook LinkedIn