- 类型关键字为interface
- 不需要显式声明实现某个接口,只要实现相关方法就实现了接口
type Person interface {
Name() string
}
type Student struct {
name string
}
func (s Student)Name() string {
return s.name
}
func main() {
var p Person
p = Student{name:"roc"}
fmt.Println(p.Name()) //roc
}
- 接口也可以组合(相当于继承)
- 可以试探是否为某个struct或interface的实例(ok pattern),相当于Java中的instanceof
type Person interface {
Name() string
}
type Teacher interface {
Person //接口组合
Teach()
}
type MyTeacher struct {
name string
class string
}
func (t MyTeacher)Name() string {
return t.name
}
func (t MyTeacher)Teach() {
fmt.Println("I am teaching ",t.class)
}
func say_hello(p Person) {
if m,ok := p.(MyTeacher);ok { //看此Person是否为MyTeacher的实例,如果是再执行if内的内容
fmt.Println("hello ",m.name)
}
}
func main() {
var t Teacher = MyTeacher{
name : "roc",
class : "english",
}
fmt.Println(t.Name()) //roc
t.Teach() //I am teaching english
say_hello(t) //hello roc
}
- 可以使用匿名接口
var a interface{
Name() string
}
- 空接口可以看作是所有struct都实现了的。匿名空接口直接写成:interface{}
- type switch可以判断某变量是哪种类型,并根据不同类型作不同处理
type A struct {
a string
}
type B struct {
b string
}
func say_hello(m interface{}) {
switch t := m.(type) { //type switch的关键
case A:
fmt.Println("hello ",t.a)
case B:
fmt.Println("hello ",t.b)
default:
fmt.Println("nobody")
}
}
func main() {
a := A{a:"a"}
b := B{b:"b"}
say_hello(a) //hello a
say_hello(b) //hello b
}
有疑问加站长微信联系(非本文作者)