博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang中如何判断一个对象是否实现了某个接口
阅读量:3986 次
发布时间:2019-05-24

本文共 1691 字,大约阅读时间需要 5 分钟。

首先golang是强类型的语言,如果类型不匹配的话编译就通不过,所以一个对象是否实现了某个接口根本就不需要判断,看这个的对象的类型就知道了。

之所以会有这样的问题,是因为一个对象的类型可能是未知的,具体表现就是它是一个接口,要么是空接口 interface{}, 要么是非空接口 interfaceA。

判断一个接口对象是什么类型使用接口的类型断言。

func f(v interface{
}) {
if _, ok := v.(int64); ok {
fmt.Println("int64") }}

或者使用 switch 。

同样的,接口也是一种类型,也可以通过断言的方式来判断一个对象是否实现了某个接口。

func f(v interface{
}) {
if _, ok := v.(InterfaceA); ok {
fmt.Println("InterfaceA") }}

还有一个场景就是,因为一个对象可能同时实现了多个接口,由于某种约束,同一个对象在不同的地方只能表现出一种特性,此时也需要断言。

func tt(v InterfaceA) {
// do some thing as InterfaceA // do some thing as InterfaceB if _, ok := v.(InterfaceB); ok {
fmt.Println("ok") }}

在阅读 database/sql 源码的时候看到这样的使用场景。

func Register(name string, driver driver.Driver) {
driversMu.Lock() defer driversMu.Unlock() if driver == nil {
panic("sql: Register driver is nil") } if _, dup := drivers[name]; dup {
panic("sql: Register called twice for driver " + name) } drivers[name] = driver}type Driver interface {
Open(name string) (Conn, error)}func Open(driverName, dataSourceName string) (*DB, error) {
driversMu.RLock() driveri, ok := drivers[driverName] driversMu.RUnlock() if !ok {
return nil, fmt.Errorf("sql: unknown driver %q (forgotten import?)", driverName) } if driverCtx, ok := driveri.(driver.DriverContext); ok {
connector, err := driverCtx.OpenConnector(dataSourceName) if err != nil {
return nil, err } return OpenDB(connector), nil } return OpenDB(dsnConnector{
dsn: dataSourceName, driver: driveri}), nil}type DriverContext interface {
OpenConnector(name string) (Connector, error)}

作为一个驱动,github.com/go-sql-driver/mysql 调用 init 方法注册到 database/sql 中供其使用。

后者并不知道前者是否实现了某些接口,在使用之前需要做断言。

转载地址:http://inaui.baihongyu.com/

你可能感兴趣的文章
C primer plus 基础总结(一)
查看>>
微服务相关问题(一)
查看>>
跳跃游戏 Jump Game 分析与整理
查看>>
剑指offer算法题分析与整理(一)
查看>>
剑指offer算法题分析与整理(二)
查看>>
剑指offer算法题分析与整理(三)
查看>>
剑指offer算法题分析与整理(四)
查看>>
剑指offer算法题分析与整理(五)
查看>>
部分笔试算法题整理
查看>>
Ubuntu 13.10使用fcitx输入法
查看>>
pidgin-lwqq 安装
查看>>
mint/ubuntu安装搜狗输入法
查看>>
C++动态申请数组和参数传递问题
查看>>
opencv学习——在MFC中读取和显示图像
查看>>
retext出现Could not parse file contents, check if you have the necessary module installed解决方案
查看>>
pyQt不同窗体间的值传递(一)——对话框关闭时返回值给主窗口
查看>>
linux mint下使用外部SMTP(如网易yeah.net)发邮件
查看>>
北京联通华为光猫HG8346R破解改桥接
查看>>
树莓派搭建可公网访问的服务器
查看>>
python使用win32*模块模拟人工操作——城通网盘下载器(一)
查看>>