golang中如何判断一个对象是否实现了某个接口

首先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 中供其使用。

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang是一种编程语言,具备强大的接口特性。在Golang接口是一种规定了对象必须遵循的行为规范。通过接口,我们可以定义一组方法的集合,任何实现了这些方法的类型都被视为实现了该接口接口实现是指一个类型声明自己遵循了某个接口实现一个接口的类型,需要实现接口定义的所有方法。实现接口的类型不需要显式声明实现了该接口,只要实现接口定义的方法即可。这种方式称为隐式接口实现接口对象是指一个接口类型的变量或参数,可以指向满足该接口的任何具体类型的对象。通过接口对象,我们可以调用接口定义的方法,而不需要关心具体对象是哪种类型。 使用接口的好处是可以将接口作为一个统一的契约,使得不同类型的对象可以通过实现相同的接口实现类型的替换和灵活的设计。接口可以实现代码的重用,并且松耦合,提高代码的可维护性和可测试性。 在实际应用,我们可以先定义接口,然后根据接口的行为规范来编写具体类型的实现接口对象可以根据需要替换为不同的具体类型对象实现了面向接口编程的思想。 总结来说,Golang接口实现是指类型声明自己遵循了某个接口实现接口定义的方法。接口对象是指可以指向满足该接口的任何具体类型的对象。通过接口,我们可以实现代码的灵活和重用,使得不同类型的对象可以通过实现相同的接口来进行类型的替换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值