/*
Author : CHR_崔贺然
Time : 2019.11.19
Description : 组合与继承,golang不支持继承是组合,多态是用duck-type
单元测试的作用是什么,因为项目只有一个入口函数,所以需要对每个功能进行单元测试,断言,Debug
定义行为(方法)的时候可以传结构体,也可以传指针,但是为了防止拷贝还是传递指针
go中不用通过->访问指针的东西,使用.就可以。指针也可以访问结构里面的属性
为了防止循环依赖,通常将interface单独放在一个包里
在golang中接口定义的name不需要在实现中被依赖,只需要实现其中的方法就可以了
将方法绑定在结构的指针
*/package main
import"fmt"type programmer interface{typing()string}type goProgrammer struct{}// 所谓的duck-typefunc(g *goProgrammer)typing()string{return"go typing"}funcmain(){var p programmer
p =new(goProgrammer)
fmt.Println(p.typing())// 继承与组合
a :=new(dog)
a.speakTo()}/*
Author : CHR_崔贺然
Time : 2019.11.19
Description : 组合与继承,所有接口的实现都是将类型为接口的变量引用new出来的实现类的对象
继承,方法的重载
继承对LSP的支持
*/type pet struct{}func(p *pet)speak(){
fmt.Println("...")}func(p *pet)speakTo(){
p.speak()
fmt.Println("666")}type dog struct{
pet
}func(d *dog)speak(){
fmt.Println("wang")}// 也是必须要重写speakTo方法才可以,java就可以直接Override(重写)func(d *dog)speakTo(){
d.speak()
fmt.Println("777")}
package main
import("fmt")type options struct{
a int64
b string
c map[int]string}func(o *options)writeA(a int64)*options {
o.a = a
return o
}func(o *options)writeB(b string)*options {
o.b = b
return o
}func(o *options)writeC(c map[int]string)*options {
o.c = c
return o
}funcmain(){
op :=new(options)
op.writeA(int64(1)).writeB("test").writeC(make(map[int]string,0))
fmt.Println(op.a, op.b, op.c)}