如何判断Golang接口是否实现?

前言

在看一个底层库的的时候,看到了一个比较奇怪的写法,于是乎有了本文。

主要探讨两个问题:
1.利用编译来判断Golang接口是否实现
2.延伸出的make和new的区别

正文

1.利用编译来判断Golang接口是否实现

看了一个底层通用链接池的库,有这么一行代码:

var _ Pooler = new(WeightedRoundRobin)

需要解释的是:Pooler是一个接口类型。

type Pooler interface {
	   // ...
}

刚开始看是疑惑的,为什么new了之后是要抛弃调?

后面发现这个是为了验证某某接口是否被实现了?

多看了一些代码后发现很多地方有类似这样的写法。

至此Get到了。

解释:如果说次接口没有被实现,那么一方面ide会有红横线出现,另一方面在编译的时候会出现报错。两方面的提示来保证写底层代码的接口是有被实现的。

2.延伸出的make和new的区别

和小伙伴讨论期间,跑出了这么一个问题:“可以使用go test的方式,去_test.go文件中定义一个接口,来判断就好了。上文判断会存在浪费内存的情况

这边两个点:
1.go test的方式肯定是可行的。
但是并没法保证程序员会真的记住去执行进行检测(非强制必须走的流程)。但是直接通过前文方式,是会在编译的时候抛错的,这个是必须走的流程,所以更推荐前文的方式。

2.new占内存?
new:申请了内存,但是不会将内存初始化,只会将内存置零,返回一个指针。

make:申请了内存,返回已初始化的结构体的零值。
在这里插入图片描述

回到正文,虽然申请了内存,但占的内存其实并不多,并且在初始化后的一次gc中便会回收。所以还好。
同时也不存在效率问题,编译型语言,你懂的。

同时验证一个new和取地址和make的区别的代码:

func main() {
	a1 := new([]int)
	a2:= &[]int{}
	a3:= make([]int,0)

	fmt.Println(a1,a2,a3,a1==a1)
}

输出:

&[] &[] [] true

附录:Golang new和 make的区别

扩展

对于内存的占用,今天看到一种写法。

var _ Tester = (*Test)(nil)

这样写和new的区别在于:new是编译的时候检查,这样写是运行的时候检查

如果你觉得有收获~可以关注我的公众号【咖啡色的羊驼】~第一时间收到我的分享和知识梳理~
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值