定义
在 Go 中,关键字 interface 被赋予了多种不同的含义。每个类型都有接口,意味着对那个类型定义了方法集合 。
- 这段代码定义了具有一个字段和两个方法的结构类型 S。
type S struct { i int }
func (p *S) Get() int { return p.i }
func (p *S) Put(v int) { p.i = v }
- 可以定义接口类型,仅仅是方法的集合。
type I interface {
Get() int
Put(int)
}
- 定义另外一个类型同样实现了接口 :
type R struct { i int }
func (p *R) Get() int { return p.i }
func (p *R) Put(v int) { p.i = v }
- 类型判断-在 switch 之外使用 (type) 是非法的。类型判断不是唯一的运行时得到类型的方法。
func f(p I) {
switch t := p.(type) { //类型判断
case *S: //p 的实际类型是 S 的指针
case *R: //p 的实际类型是 R 的指针
case S: //p 的实际类型是 S
case R: //p 的实际类型是 R
default: //实现了 I 的其他类型
}
}
- 为了在运行时得到类型,同样可以使用 “comma, ok” 来判断一个接口类型是否实现了某个特定接口:
if t, ok := something.(I) ; ok {
// 对于某些实现了接口 I 的
// t 是其所拥有的类型
}
- 确定一个变量实现了某个接口,可以使用:
t := something.(I)
- 空接口
由于每个类型都能匹配到空接口: interface{}。
func g(something interface { }) int {
return something.(I).Get()
}
有疑问加站长微信联系(非本文作者)