晚上睡不着网站2021免费,网站可信认证在哪里做,渠道营销推广方案,做网站招商需要具备什么文章目录 duck typingnil不一定是空接口组合代替继承接口转换回具体的类型使用switch匹配接口的原始类型 duck typing
golang中实现某个接口不需要像其它语言使用 implemet 去继承实现#xff0c;而是只要你的结构体包含接口所需的方法即可
package mainimport fmt而是只要你的结构体包含接口所需的方法即可
package mainimport fmttype Person interface {talk()
}type XM struct {
}func (receiver XM) talk() {fmt.Println(I am XM)
}func main() {var p Personp XM{}p.talk() // I am XM
}
nil不一定是空接口
初始化的接口是等于 nil的接口底层其实有一个type来记录原始的struct当某个struct赋值给接口时接口会在type中记录该类型就算是nil也会记录此时接口打印出来是nil但和nil并不相等
}type XM struct {
}func (X XM) talk() {fmt.Println(I am XM)
}func main() {var p Personif p nil {fmt.Println(var p Person is nil) //var p Person is nil}var a *XMif a nil {fmt.Println(var a *XM is nil) //var a *XM is nil}p aif p ! nil {fmt.Println(var p ! nil) //var p ! nil}fmt.Println(p) // nil
}
组合代替继承
通过内嵌组合来继承功能,XM匿名内嵌了Person就具有了Person的能力
package mainimport fmttype Person struct {Name string
}func (receiver Person) Talk() {fmt.Printf(I am %s \n, receiver.Name)
}type XM struct {Person
}func main() {var xm XMp : Person{Name: Person}xm.Name XMxm.Talk() // I am XMp.Talk() // I am Person
}
重写方法只需要声明一个同名方法即可
package mainimport fmttype Person struct {Name string
}func (receiver Person) Talk() {fmt.Printf(I am %s \n, receiver.Name)
}type XM struct {Person
}func (receiver XM) Talk() {fmt.Printf(hello,I am %s, receiver.Name)
}func main() {var xm XMxm.Name XMxm.Talk() // hello,I am XM
}
接口转换回具体的类型
struct 转为接口只要struct 拥有 接口的方法即可将struct 赋值给接口如果想将接口转回struct可以使用 result,ok : interface.(struct), ok 代表是否能够成功转换
package mainimport fmttype IAnimal interface {Eat()
}type Bridge struct {
}func (b Bridge) Eat() {fmt.Println(I can eat)
}func (b Bridge) Fly() {fmt.Println(I can fly)
}type Fish struct {
}func (f Fish) Eat() {fmt.Println(I can eat)
}func ShowTime(animal IAnimal) {animal.Eat()if b, ok : animal.(Bridge); ok {b.Fly()}
}func main() {var (f Fishb Bridge)ShowTime(f) // I can eatfmt.Println(--------------)ShowTime(b) // I can eat \n I can fly
}
ok 判断的是完全转换就算不ok转换后的结果也可以调用struct的方法但是不建议这么做
package mainimport fmttype IAnimal interface {Eat()
}type Bridge struct {Name string
}func (b Bridge) Eat() {fmt.Println(b.Name I can eat)
}func (b Bridge) Fly() {fmt.Println(b.Name I can fly)
}type Fish struct {Name string
}func (f Fish) Eat() {fmt.Println(f.Name I can eat)
}func ShowTime(animal IAnimal) {animal.Eat()b, ok : animal.(Bridge)fmt.Println(ok)b.Fly()
}func main() {f : Fish{Name: fish}b : Bridge{Name: bridge}ShowTime(f)// fishI can eat// false// I can flyfmt.Println(--------------)ShowTime(b)//bridgeI can eat// true//bridgeI can fly
}
使用switch匹配接口的原始类型
struct.(type) 可以获取接口的原始类型但是只能在switch中使用
package mainimport fmttype IAnimal interface {Eat()
}type Bridge struct {Name string
}func (b Bridge) Eat() {fmt.Println(b.Name I can eat)
}func (b Bridge) Fly() {fmt.Println(b.Name I can fly)
}type Fish struct {Name string
}func (f Fish) Eat() {fmt.Println(f.Name I can eat)
}func ShowTime(animal IAnimal) {switch animal.(type) {case Fish:fmt.Println(原先是Fish)case Bridge:fmt.Println(原先是Bridge)}
}func main() {var (f Fishb Bridge)ShowTime(f) // 原先是FishShowTime(b) // 原先是Bridge
}