多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
> ### 接口 interface ~~~ //接口是方法签名的集合(方法签名就是定义为:方法名+参数列表) package main import "fmt" //几何体的接口。 type geometry interface { area() int64 perimeter() int64 } type square struct { longside int64 } type rectangle struct { width, height int64 } //正方形实现几何体接口 //只要某个类型拥有该接口的所有方法签名,即算实现该接口 //任何其他类型都实现了空接口 func (s square) area() int64 { return s.longside * s.longside } func (s square) perimeter() int64 { return s.longside * 4 } func (r rectangle) area() int64 { return r.width * r.height } func (r rectangle) perimeter() int64 { return (r.width + r.height) * 2 } //如果一个变量是接口类型, 可以通过这个变量调用接口里的方法 //一个函数把interface{}作为参数,那么他可以接受任意类型的值作为参数,如果一个函数返回interface{},那么也就可以返回任意类型的值 func test(g geometry) { fmt.Println(g) fmt.Printf("面积是%d,周长是%d\n", g.area(), g.perimeter()) } func main() { s := square{longside: 5} r := rectangle{width: 7, height: 8} fmt.Printf("正方形的面积是%d,周长是%d\n", s.area(), s.perimeter()) fmt.Printf("长方形的面积是%d,周长是%d\n", r.area(), r.perimeter()) test(s) test(r) } ~~~ * 类型断言 ~~~ //必须为initerface类型才可以进行类型断言 //致命错误, 只退出当前协程 var i interface{} = 1 x := i.(string) fmt.Println(x) ~~~ * * * ~~~ var i interface{} = 1 v, ok := i.(int) fmt.Println(v, ok) ~~~ * Go计划2.0加入泛型, 什么是泛型?(# Java 泛型 :[http://www.runoob.com/java/java-generics.html](http://www.runoob.com/java/java-generics.html)) > ### 相关阅读 * [为什么在Go语言中要慎用interface{}](https://juejin.im/post/5ad1c766518825555e5e4646)