go语言接口断言的使用
go语言里接口断言和类型断言一样,是用于判断某个对象是否有接口的所有方法。格式如:返回值,bool变量:=要判断的具体对象.(具体接口),当该对象具有我们要判断的接口方法时,就会返回true,通过返回值就能调用特定的方法。
使用范例如下:
// test
package main
import (
"fmt"
)
type Flyer interface {
Fly()
}
type Walker interface {
Walk()
}
type Bird struct {
}
type Dog struct {
}
func (b Bird) Fly() {
fmt.Println("the bird can fly!")
}
func (b Bird) Walk() {
fmt.Println("the bird can walk!")
}
func (d *Dog) Walk() { //因为这里是用的指针传递,所以当调用接口方法时,必须要传递地址,不能是值。
fmt.Println("the dog can walk!")
}
func main() {
var i interface{} //声明一个接口对象
i = new(Bird) //创建一个Bird结构体变量,返回的是一个结构体指针,并赋值给接口
v, b := i.(Flyer) //判断是否有飞行接口,
if b { //如判断成功,则v就是飞行接口类型
v.Fly()
}
v1, b := i.(Walker) //判断是否有行走接口
if b {
v1.Walk()
}
//创建一个Dog结构体变量,然后把结构体地址赋值给接口,如写成i=Dog{},就无法调用Walk方法了,因为那里是接收的一个结构体指针。
//所以将具体类型变量赋值给接口时,尽量使用指针传递,就是new(结构体类型)或者&结构体类型{}这两种写法,
//这样不论类型变量的接口方法实现,是用值传递还是指针传递,都可以调用。
i = &Dog{}
v, b = i.(Flyer)
if b {
v.Fly()
}
v1, b = i.(Walker)
if b {
v1.Walk()
}
}
这里注意,因为上边Dog类型的Walk方法,是用的指针传递,所以在赋值给接口时,要用地址传递,就是i=&Dog{}这一句。如写成i=Dog{},就不会打印出“the dog can walk”这一句话了。所以,建议是:在把具体类型变量赋值给接口时,尽量用指针传递,那样可以确保能调用到对应接口的方法。
到此这篇关于“go语言接口断言的使用”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!您可能感兴趣的文章:
Golang 基础教程
想系统学习GO语言(Golang
从零学习 Go 语言(24):理解 Go 语言中的 goroutine
Go 语言到底适合干什么?
Go语言的空接口,接口类型断言
Go语言开发必读书目,从菜鸟到大牛必备
Go语言接口interface
Golang库集合
兄弟连golang神技(1)-关于 Go 语言的介绍
从零学习 Go 语言(33):如何手动实现一个协程池?