package
0.0.0-20230305103854-d072998a33f3
Repository: https://github.com/felixstarship/go11.git
Documentation: pkg.go.dev
# README
golang中结构体嵌套接口
在golang中结构体A嵌套另一个结构体B见的很多,可以扩展A的能力。
A不仅拥有了B的属性,还拥有了B的方法,这里面还有一个字段提升的概念。
package main
import "fmt"
type Worker struct {
Name string
Age int
// 结构体类型嵌套
Salary
}
func (w Worker) fun1() {
fmt.Println("Worker fun1")
}
type Salary struct {
Money int
}
func (s Salary) fun1() {
fmt.Println("Salary fun1")
}
func (s Salary) fun2() {
fmt.Println("Salary fun2")
}
func main() {
s := Salary{}
w := Worker{Salary: s}
//w.Name
//w.Age
//w.Money
//w.Salary
//w.fun1()
//w.fun2()
//w.Salary.fun1()
//w.Salary.fun2()
}
很明显现在 Worker 强依赖与 Salary ,有时候我们希望 Worker 只依赖于一个接口,这样只要实现了此接口的对象都可以传递进来。
优化之后:
package main
import "fmt"
type Inter1 interface {
fun1()
fun2()
}
type Worker struct {
Name string
Age int
// 内嵌接口类型:对外多态实现,只要实现了Inter1接口的对象都可以【赋值】
Inter1
}
func (w Worker) fun1() {
fmt.Println("Worker fun1")
}
type Salary struct {
Money int
}
func (s Salary) fun1() {
fmt.Println("Salary fun1")
}
func (s Salary) fun2() {
fmt.Println("Salary fun2")
}
func main() {
s := Salary{}
w := Worker{Inter1: s}
//w.Age
//w.Name
//w.fun1()
//w.fun2() 隐式调用Inter1对应的成员方法
//w.Inter1
//w.Inter1.fun1()
//w.Inter1.fun2()
// 无法访问 Money 属性,可以增加方法来实现
}