基本的要素
import ( “io” “log” “os” )
// 动物接口 type Animal interface { Sleep() //动物都能做的 睡觉 GetColor() string //取得动物的颜色 GetType() string // 取得动物的种类 }
func ShowAnimal(v Animal) { v.Sleep() //多态方法, 不管是猫还是狗, 直接睡觉
log.Println("动物种类=", v.GetType())
log.Println("动物颜色=", v.GetColor())
}
// 猫 type Cat struct { color string // 猫的颜色
}
func (t *Cat) Sleep() { log.Println(“猫开始睡觉”) }
func (t *Cat) GetColor() string { return t.color }
func (t *Cat) GetType() string { return “家猫” }
// 狗 type Dog struct { color string // 狗的颜色
}
func (t *Dog) Sleep() { log.Println(“狗开始睡觉”) }
func (t *Dog) GetColor() string { return t.color }
func (t *Dog) GetType() string { return “野狗” }
func main() { log.SetOutput(io.MultiWriter(os.Stdout)) log.SetFlags(log.Lshortfile)
cat := Cat{color: "白"}
dog := Dog{color: "黄"}
ShowAnimal(&cat)
log.Println("----------")
ShowAnimal(&dog)
}
<a name="snAIz"></a>
### 输出
```go
main.go:30: 猫开始睡觉
main.go:19: 动物种类= 家猫
main.go:20: 动物颜色= 白
main.go:67: ----------
main.go:48: 狗开始睡觉
main.go:19: 动物种类= 野狗
main.go:20: 动物颜色= 黄
interface 通用万能数据数据类型
- 空接口
int``string``float32
float64``struct
都实现了interface{}
- 可以使用 interface{} 类型 引用 任意的数据类型
代码
```go package main
import ( “io” “log” “os” )
type Book struct { title string }
// interface 万能数据类型 func myFunc(arg interface{}) { log.Println(arg)
// interfacef{} 改如何区分 此时引用的底层数据类型到底是什么?
// 给interfacef{}提供 "类型断言" 的机制
v, ok := arg.(string)
if ok {
log.Println("arg 参数为字符串类型")
log.Printf("字符串内容是=%v, 数据类型: %T\n", v, v)
}
log.Printf("实际数据类型: %T", arg)
}
func main() { log.SetOutput(io.MultiWriter(os.Stdout)) log.SetFlags(log.Lshortfile)
book := Book{"golang"}
myFunc(book)
log.Println("--------------")
myFunc("字符串")
log.Println("--------------")
myFunc(100)
log.Println("--------------")
myFunc(3.14)
}
<a name="Cldsh"></a>
### 输出
```go
main.go:15: {golang}
main.go:25: 实际数据类型: main.Book
main.go:35: --------------
main.go:15: 字符串
main.go:21: arg 参数为字符串类型
main.go:22: 字符串内容是=字符串, 数据类型: string
main.go:25: 实际数据类型: string
main.go:37: --------------
main.go:15: 100
main.go:25: 实际数据类型: int
main.go:39: --------------
main.go:15: 3.14
main.go:25: 实际数据类型: float64