package main
import "fmt"
type in interface {
String()
}
type A struct {
}
func (a *A) String() {
fmt.Println("I am A!")
}
func (a *A) StringA() {
fmt.Println("I am A! Doing StringA()")
}
type B struct {
str string
}
func (b *B) String() {
fmt.Println("I am B!")
}
func (b *B) StringB() {
fmt.Println("I am B! Doing StringB()")
}
func main() {
var i in
i = &B{}
//t := i.(type) //编译报错:use of .(type) outside type switch
switch t := i.(type) {
case *A:
t.String()
t.StringA()
case *B:
t.String()
t.StringB()
default:
}
}
阅读golang net包源码时,遇到了有趣的写法 .(type)
理解是获取接口实例实际的类型指针,以此调用实例所有可调用的方法,包括接口方法及自有方法。
需要注意的是该写法必须与switch case联合使用,case中列出实现该接口的类型。