可以看下面的代码:
A 中的 B 是接口,并且初始化A是通过外部传入的。
这样就保证了扩展性
因为具体的实现是交给外部去做的,不需要改A的任何代码。A 只负责调用即可。
需要一个 B1 那么就传一个 B1 的进来
需要一个 B2 那么就传一个 B2 的进来
B1 和 B2 都是实现了B 接口的!
package main
import "fmt"
type A struct {
b B
}
func NewA(b B) *A {
return &A{
b: b,
}
}
type B interface {
Get(string) string
}
type B1 struct {
}
func (b *B1) Get(name string) string {
return "this is B1" + name
}
type B2 struct {
}
func (b *B2) Get(name string) string {
return "this is B2" + name
}
func main() {
var b1 = &B1{}
var b2 = &B2{}
var a1 = NewA(b1)
var a2 = NewA(b2)
fmt.Println(a1.b.Get("cc"))
fmt.Println(a2.b.Get("cc"))
}
this is B1cc
this is B2cc