-------------------- 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, ... }