1、继承
package mainimport "fmt"//定义父类 Humantype Human struct { id string name string}//get set 方法-------------------func (this *Human) getId() string{ return this.id}func (this *Human) getName() string { return this.name}func (this *Human) setId(id string) { this.id = id;}func (this *Human) setName(name string) { this.name = name;}// -----------------------------//普通方法 --------------------------func (this *Human) Eat() { fmt.Println("Human.Eat()...")}func (this *Human) Walk() { fmt.Println("Human.Walk()...")}// -----------------------------//定义子类type SuperMan struct { Human // superMan 继承 Human level int}//重定义父类方法func (this *SuperMan) Eat() { fmt.Println("SuperMan.Eat()...")}//子类新方法func (this *SuperMan) Fly() { fmt.Println("SuperMan.Fly()...")}func main() { h := Human{"1","张三"} fmt.Println(h.getName()) h.Eat() h.Walk() s := SuperMan{Human{"2","李四"},2} fmt.Println(s.getName()) s.getName() s.Eat() s.Walk() s.Fly()}
2、多态
package mainimport "fmt"//实际是一个指针type AnimalIF interface { sleep() GetColor() string//获取动物颜色 GetType() string//获取动物类型}//定义一个类,必须实现接口所有的方法,才算实现type Cat struct { color string}func (this *Cat) sleep() { fmt.Println("喵睡觉")}func (this *Cat) GetColor() string{ return this.color}func (this *Cat) GetType() string{ return "喵喵"}type Dog struct { color string}func (this *Dog) sleep() { fmt.Println("汪睡觉")}func (this *Dog) GetColor() string{ return this.color}func (this *Dog) GetType() string{ return "汪汪"}func showAnimal(an AnimalIF) { an.sleep() fmt.Println(an.GetColor()) fmt.Println(an.GetType())}func main() { var an AnimalIF an = &Cat{"blue"} an.sleep() fmt.Println(an.GetColor()) fmt.Println(an.GetType()) showAnimal(&Dog{"yellow"})}
3、interface

package mainimport "fmt"func myFunc(a interface{}) { fmt.Println(a) //interface{} 如何区分引用的底层数据类型是什么 //给 interface{} 提供“类型断言”的机制 value,ok := a.(string) if !ok{ fmt.Println("not string type") }else{ fmt.Println("string type") fmt.Printf("%T\n",value) }}type miao struct { cc string}func main() { m := miao{"ccc"} myFunc(m) myFunc("aaa")}