-------------------- interface 接口
// 定义:
type IHumaner interface {
SayHi() // 接口中只能是方法声明,没有实现,没有数据字段
}
// Student ...
type Student struct {
id int
name string
}
func (tmp *Student) SayHi() {
fmt.Println("Student[%s, %d] SayHi", tmp.name, tmp.id)
}
// Teacher ...
type Teacher struct {
addr string
group string
}
func (tmp *Teacher) SayHi() {
fmt.Println("Teacher[%s, %d] SayHi", tmp.addr, tmp.group)
}
// MyStr
type MyStr string
func (tmp *MyStr) SayHi() {
fmt.Println("MyStr[%s, %d] SayHi", *tmp)
}
func main() {
// 定义接口类型的变量
var i IHumaner
// 只是实现了此接口的方法的类型,那么这个类型的变量(接收者类型)就可以给i赋值
s := &Student{"loong", 666}
i = s
i.SayHi()
t := &Teacher{"cls", "ShenZhen"}
i = t
i.SayHi()
var str MyStr = "hello loong"
i = &str
i.SayHi()
// Print Result
// loong 666 ... cls ... hello loong
}
-------------------- interface 接口 多态的应用
// 多态的应用
func WhoSayHi(i IHumaner){
i.SayHi()
}
// 调用多态
s := &Student{"loong", 666}
t := &Teacher{"cls", "ShenZhen"}
var str MyStr = "hello loong"
WhoSayHi(s)
WhoSayHi(t)
WhoSayHi(&str)
// 创建一个切片
x := make([]IHumaner, 3)
x[0] = s
x[1] = t
x[2] = &str
for _, i := range x {
i.SayHi()
}
-------------------- interface 空接口 (任务类型)
func main() {
// 空接口是万能类型
type tmp interface{} = 1
// 字符串
tmp = "abc"
tmp = &v2
// .. 等等数据类型
// ***** 打印参数的内部实现就是采用的空接口
// ftm.Println(args ...interface{})
}
-------------------- 类型断言 (类型查询)
struct Student struct {
id int
name string
}
func main() {
i := make([]interface{}, 3)
i[0] = 1
i[1] = "hello go"
i[2] = Student{666, "loong"}
// 类型查询
for index, data := range i {
// 第一个返回值,第二个返回判断结果的真假
if value, ok := data.(int); ok == true {
}
// data.(string) data.(Student) 都可以作为判断
}
// 同理,data.(type) 也可以作用于判断类型 return int, string, ...
}