如果说gorountine和通道是支撑起去语言的并发模型的基石,让去语言在如今集群化与多核化的时代成为一道亮丽的风景,那么接口是去语言整个类型系列的基石,让去语言在基础编程哲学的探索上达到前所未有的高度.Go语言在编程哲学上是变革派,而不是改良派。这不是因为去语言有gorountine和通道,而更重要的是因为去语言的类型系统,更是因为去语言的接口.Go语言的编程哲学因为有接口而趋于完美c + +, Java使用“侵入式”接口,主要表现在实现类需要明确声明自己实现了某个接口。这种强制性的接口继承方式是面向对象编程思想发展过程中一个遭受相当多质疑的特性.Go语言采用的是“非侵入式接口”,去语言的接口有其独到之处:只要类型T的公开方法完全满足接口我的要求,就可以把类T型的对象用在需要接口我的地方,所谓类型T的公开方法完全满足接口我的要求,也即是类型T实现了接口我所规定的一组成员。这种做法的学名叫做结构类型,有人也把它看作是一种静态的Duck Typing。
,,,
要这个值实现了接口的方法。
类型读者接口{ 读(p[]字节)(n int,犯错os.Error) }//作家是包裹了基础写方法的接口。 {作家接口类型 写(p[]字节)(n int,犯错os.Error) } var r io.Reader r=os.Stdin r=bufio.NewReader(右) r=新(bytes.Buffer)
有一个事情是一定要明确的,不论r保存了什么值,r的类型总是<代码> io。读者> 代码,是静态类型,而r的静态类型是io。读者。接口类型的一个极端重要的例子是空接口接口{},它表示空的方法集合,由于任何值都有零个或者多个方法,所以任何值都可以满足它。也有人说去的接口是动态类型的,不过这是一种误解。它们是静态类型的:接口类型的变量总是有着相同的静态类型,这个值总是满足空接口,只是存储在接口变量中的值运行时可能被改变。对于所有这些都必须严谨的对待,因为反射和接口密切相关。
在类型中有一个重要的类别就是接口类型,表达了固定的一个方法集合。一个接口变量可以存储任意实际值(非接口),只要这个值实现了接口的方法.interface在内存上实际由两个成员组成,如下图,标签指向虚表,数据则指向实际引用的数据。虚表描绘了实际的类型信息及该接口所需要的方法集。
{斯特林格接口类型 字符串()字符串 } 类型的二进制uint64 func(二进制)字符串String () { 返回strconv.FormatUint (i.Get (), 2) } uint64 func(二进制)得到(){ 返回uint64(我) } 函数main () { var b二进制=32 s:=斯特林格(b) fmt.Print (s.String ()) }