教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 go语言接口断言的使用

go语言接口断言的使用

发布时间:2021-05-23   编辑:jiaochengji.com
教程集为您提供go语言接口断言的使用等资源,欢迎您收藏本站,我们将为您提供最新的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):如何手动实现一个协程池?

[关闭]
~ ~