Go不是传统的面向对象编程,因此没有类的概念。可是它有灵活的接口(interface)在必定程度上能实现面向对象的不少特性。编程
1 type Namer interface{ 2 Method1(param_list)return_type 3 Method2(param_list)return_type 4 } 数据结构
在Go语言中接口能够有值,一个接口类型的变量或一个接口值是一个多字节数据结构,它的值是nil。它本质上是一个指针,虽然不彻底是一回事。指向接口值的指针是非法的。lua
类型(好比结构体)实现接口方法集中的方法,每个方法的实现说明了此方法是如何做用于该类型的:即实现接口(实现接口中全部方法,才算是接口实现),同时方法集也构成了该类型的接口。实现了 Namer
接口类型的变量能够赋值给 ai
(接收者值),此时方法表中的指针会指向被实现的接口方法。固然若是另外一个类型(也实现了该接口)的变量被赋值给 ai
,这两者(译者注:指针和方法实现)也会随之改变(能够认为是Go中所表现的多态)。spa
1 package main 2 3 import "fmt" 4 5 type valuable interface { 6 getValue() float32 7 } 8 9 type stockPosition struct { 10 ticker string 11 sharePrice float32 12 count float32 13 } 14 15 func (s stockPosition) getValue() float32 { 16 return s.sharePrice * s.count 17 } 18 19 type car struct { 20 make string 21 model string 22 price float32 23 } 24 25 func (c car) getValue() float32 { 26 return c.price 27 } 28 29 func showValue(v valuable) { 30 fmt.Printf("value of the asset is %f\n", v.getValue()) 31 } 32 33 func main() { 34 var o valuable = stockPosition{"Golang", 99.9, 4} 35 showValue(o) 36 o = car{"BMW", "M3", 66500} 37 showValue(o) 38 }
在接口上调用方法时,必须有和方法定义时相同的接收者类型或者是能够从具体类型 P
直接能够辨识的:指针
将一个值赋值给一个接口时,编译器会确保全部可能的接口方法均可以在此值上被调用,所以不正确的赋值在编译期就会失败。code