1、继承
package main
import "fmt"
//定义父类 Human
type 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 main
import "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 main
import "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")
}