package main import ( "fmt" ) //接口是一个或多个方法签名的集合 type USB interface { //接口只有方法声明,没有实现,没有数据字段 Name() string //接口可以匿名嵌入其它接口,或嵌入到结构中 Connecter } type Connecter interface { Connect() } type PhoneConnecter struct { name string } //只要某个类型拥有该接口的所有方法签名,即算实现该接口 func (pc PhoneConnecter) Name() string { return pc.name } func (pc PhoneConnecter) Connect() { fmt.Println("Connected:", pc.name) } func DisConnect(usb USB) { /* if pc, ok := usb.(PhoneConnecter); ok { fmt.Println("Disconnected.", pc.name) return } fmt.Println("Unknown decive.") */ //优化后如下 switch v := usb.(type) { case PhoneConnecter: fmt.Println("Disconnected PhoneConnecter.", v.name) case USB: fmt.Println("Disconnected USB.") default: fmt.Println("Unknown decive.") } } func main() { a := PhoneConnecter{"PhoneConnecter"} a.Connect() DisConnect(a) //PhoneConnecter 转换为 Connecter pc := PhoneConnecter{"Phone"} var c Connecter //将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,既无法修改复制品的状态,也无法获取指针 c = Connecter(pc) c.Connect() pc.name = "PC" a.Connect() fmt.Println("-------------------") //只有当接口存储的类型和对象都为nil时,接口才等于nil var b interface{} fmt.Println(b == nil) var p *int = nil b = p fmt.Println(b == nil) }
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句