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”这一句话了。所以,建议是:在把具体类型变量赋值给接口时,尽量用指针传递,那样可以确保能调用到对应接口的方法。
4万+

被折叠的 条评论
为什么被折叠?



