当前位置:网站首页>【Golang】判断某一类型是否实现指定接口的几种方法
【Golang】判断某一类型是否实现指定接口的几种方法
2022-08-06 12:46:00 【田土豆】
1. 通过Implements方法
1.1 方法定义
Implements是Type接口类型的一个方法,专门用来判断某类型是否实现了指定接口,定义如下:
type Type interface {
...
// Implements reports whether the type implements the interface type u.
Implements(u Type) bool
...
}
1.2 实践
dog结构体实现了animal接口,最终返回值为true
package main
import (
"fmt"
"reflect"
)
type dog struct {
}
type animal interface {
speak()
}
func (a *dog) speak() {
fmt.Println("wang wang wang!")
}
func main() {
typ_dog := reflect.TypeOf(&dog{
})
typ_animal := reflect.TypeOf((*animal)(nil)).Elem()
fmt.Println(typ_dog.Implements(typ_animal))
}
2. 通过赋值/传参的方式
这种方式相对比较low,一般编译时直接报错(或者IDE直接就给错误提示了),会导致程序无法运行
看下面一个例子,dog结构体实现了animal接口,最终成功输出success
package main
import (
"fmt"
)
type dog struct {
}
type animal interface {
speak()
}
func (a *dog) speak() {
fmt.Println("wang wang wang!")
}
func test(a animal) {
fmt.Println("success")
}
func main() {
test(&dog{
})
}
如果dog结构体没有实现animal接口,main函数中的test()就会报错
ps:
类似的判断方法还有
var _ animal = (*dog)(nil)var _ animal = &dog{}
3. 通过断言的方式
通过断言方式接口.(类型)也可以判断某一类型是否实现指定接口(也会编译时报错),看下面的例子,最终会输出success
package main
import (
"fmt"
)
type dog struct {
}
type animal interface {
speak()
}
func (a *dog) speak() {
fmt.Println("wang wang wang!")
}
func test(a animal) {
if _, ok := a.(*dog); ok {
fmt.Println("success")
}
}
func main() {
test(&dog{
})
}
下图是没有实现接口时的报错
ps: 类似的断言方法还有(下面一串代码a的值为nil,ok为false)
func main() {
var a animal
if _, ok := a.(*dog); ok {
fmt.Println(ok)
}
}
注:使用断言时,如果接口类型的值为nil,使用if _, ok := 接口.(类型),其ok值为false
边栏推荐
- Kubernetes 虚拟机部署弊端
- 动物主题网页设计(小白必看)
- SQL图解面试题:如何找到破产玩家?(交叉连接)
- 哈希表 | 有效字母异位词 | leecode刷题笔记
- vulnhub-DC-2靶机渗透记录
- NASA suspends all spacewalks on the International Space Station due to safety issues with spacesuits
- leetcode买卖股票系列问题
- 干货 | 那些鬼斧神工的池化操作,看完我炸裂!
- Qt下编译警告unused parameter ,参数未使用
- Kubernetes stain and tolerance
猜你喜欢

【TypeScript】深入学习TypeScript装饰器

IPv6地址规划

高性能云原生数据对象存储MinIO实战-上
产品经理需求池管理

锐捷MPLS 网络配置实例 ---尚文网络奎哥

【SSL集训DAY1】D【动态规划】【状态压缩】

Kubernetes 集群 Ingress 网关

疫情期间去英国游学留学安全吗?签证转机、保险入关~

PS6603 代理直销Type-C PD 电源传输接收 SINK 端控制器芯片

Yizhiwei Digital Twin Smart Port | Create a "brain" for intelligent dispatching and comprehensive management and control, and realize a "new upgrade" of port construction
随机推荐
“恰好装满求最值”背包问题的初始化解析
OPENCV学习DAY10
PHP fopen写入文件内容
生产级Redis 高并发分布式锁实战2:缓存架构设计问题优化
链表 | 两两交换链表中的节点 | leecode刷题笔记
【Web3 系列开发教程——创建你的第一个 NFT(6)】为 NFT 设置价格
STM32 startup process - startup_xxxx.s file analysis (MDK and GCC dual environment)
SQL图解面试题:人均付费如何分析?(分组、条件汇总)
PS6603-USB PD protocol SINK terminal output controller chip
stdout stderr 重定向到文件
Compilation warning unused parameter under Qt, the parameter is not used
IT监控常青树Zabbix6部署全流程-尚文网络xUP楠哥
【Web3 系列开发教程——创建你的第一个 NFT(5)】使用 Ethers.js 铸造 NFT | 测试用例
易知微数字孪生智慧港口|打造智能化调度综合管控“大脑”,实现港口建设“新升级”
微信模板消息跳转小程序
Kubernetes 虚拟机部署弊端
rtklib-RINEX文件读取-rinex.c解析(一)
PBJ | 浙大马斌/茶叶所徐平-微生物组关联分析茶树-微生物遗传机制
机器学习实战-梯度下降法在线性回归模型中的使用
Kotlin-inline:你需要知道的一切(Android)