本文共 1223 字,大约阅读时间需要 4 分钟。
在golang中结构体A嵌套另一个结构体B见的很多,可以扩展A的能力。
A不仅拥有了B的属性,还拥有了B的方法,这里面还有一个字段提升的概念。
示例:
package mainimport "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 mainimport "fmt"type Inter1 interface { fun1() fun2()}type Worker struct { Name string Age int 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() //w.Inter1 //w.Inter1.fun1() //w.Inter1.fun2() // 无法访问 Money 属性,可以增加方法来实现}
Worker 依赖一个 Inter1 接口,只要实现了 Inter1 的对象都可以注入。
Worker 也实现了 Inter1 接口。 Worker 可以重新实现 Inter1 接口的方法。golang的context标准库就是这样实现的context之间的嵌套。
转载地址:http://nnaui.baihongyu.com/