——————– 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, ...
}
原文
https://studygolang.com/articles/13941
本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » C#/JAVA 程序员转GO/GOLANG程序员笔记大全(DAY 04)