go接口
接口定义了一种类型需要实现的方法(method),由于接口中不存在成员变量,也不存在方法实现,所以可以解决多继承中的冲突(即使方法名重复了也没啥,不会出现歧义)。
go中实现接口的方式很巧妙,不是显式地声明实现某个接口,比如java中的implements
,而是隐式地检查一个类型是否实现了特定接口的方法,Go语言中的接口与其他语言最大的一点区别是它的非侵入性,比如:
package main
import (
"fmt"
"math"
)
type Shape interface {
Area() float64
}
type Circle struct {
radius float64
}
func (c Circle) Area() float64 {
return math.Pi * c.radius * c.radius
}
func main() {
var s Shape = Circle{1}
fmt.Println(s.Area())
}
类型断言
类型断言有两种形式:
- res := x.(T)
- res, ok := x.(T)
其中x必须是接口(空接口亦可),T可以是接口或具体类型, ok表示断言是否成功,若成功则res的值为x的值,类型为x的类型,否则panic。
接口值比较
接口值可以用==
和!=
相比较。两个接口值相等,仅当他们都是nil
,或者他们动态类型相同,并且动态的值也根据这个动态类型的==
相等。