如何判断golang接口是否实现?(代码片段)

咖啡色的羊驼 咖啡色的羊驼     2022-12-06     353

关键词:

前言

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

主要探讨两个问题:
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是编译的时候检查,这样写是运行的时候检查

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

golang判断文件是否存在(代码片段)

判断一个文件是否存在是一个相当常见的需求,在golang中也有多种方案实现这一功能。现在我们介绍其中两种最常用也是最简单的实现,第一种将是跨平台通用的,而第二种则在POSIX平台上通用。跨平台实现跨平台实现的思路很... 查看详情

golang实现接口(代码片段)

查看详情

go判断元素是否在切片中(代码片段)

...比5.转换通用化6.借助开源库golang-set7.小结参考文献1.问题如何判断元素是否在切片中,Golang并没有提供直接的库函数来判断,最容易想到的实现便是通过遍历来判断。2.遍历查询以字符串切片为例,判断字符串切片中... 查看详情

go判断元素是否在切片中(代码片段)

...比5.转换通用化6.借助开源库golang-set7.小结参考文献1.问题如何判断元素是否在切片中,Golang并没有提供直接的库函数来判断,最容易想到的实现便是通过遍历来判断。2.遍历查询以字符串切片为例,判断字符串切片中... 查看详情

如何使用golang实现一个api网关(代码片段)

你是否也存在过这样的需求,想要公开一个接口到网络上。但是还得加点权限,否则被人乱调用就不好了。这个权限验证的过程,最好越简单越好,可能只是对比两个字符串相等就够了。一般情况下我们遇到这种需要,就是在函... 查看详情

如何使用golang实现一个api网关(代码片段)

你是否也存在过这样的需求,想要公开一个接口到网络上。但是还得加点权限,否则被人乱调用就不好了。这个权限验证的过程,最好越简单越好,可能只是对比两个字符串相等就够了。一般情况下我们遇到这种需要,就是在函... 查看详情

golang接口interface断言switchtype(代码片段)

...ey:"1"b2=Bag2Key:0//获取interface中存放的数据类型//方法一://判断是否是Bag类型若不是则置0b,ok:=b1.(Bag)fmt.Println("Bag类型:",ok,"数据",b)//判断是否是Bag2类型若不是则置0b,ok:=b2.(Bag2)fmt.Println("Bag2类型:",ok,"数据",b)//方法二:switchv:=b1.(typ... 查看详情

golang接口---中(代码片段)

GoLang接口---中引言接口的类型断言实例演示类型判断:type-switchnil和non-nil空接口构建通用类型或包含不同类型变量的数组复制数据切片至空接口切片通用类型的节点数据结构接口到接口参考引言GoLang接口—上上一篇文章中... 查看详情

golang接口的使用(练习一)(代码片段)

...接口要求的所有函数,我们就说这个类实现了这个接口。golang接口赋值实现方式一:将对象实例赋值给接口packagemainimport"fmt"//定义一个Animal接口,实现飞和跑的功能typeAnimalinterfaceFly()Run()//定义一个Bird类typeBirdstruct//通过类实现接... 查看详情

golang接口定义实现(efaceiface)和设计模式(代码片段)

...录定义接口实现接口空接口类型断言接口类型在运行时是如何实现的🔥接口设计的7个建议🔥本文是我学习GoTour和Go语言第一课接口相关章节的笔记,如有理解不当之处,恳请留言指出,感谢!定义接口接... 查看详情

golang接口---下(代码片段)

GoLang接口---下接口与动态类型Go的动态类型动态方法调用接口的提取空接口和函数重载接口的继承Go中的面向对象接口与动态类型Go的动态类型在经典的面向对象语言(像C++,Java和C#)中数据和方法被封装为类的... 查看详情

golang策略设计模式(代码片段)

...厂模式是传入参数后创建对象,根据传入的参数写逻辑来判断应该创建什么类型的对象,模式的使用者调用对象统一的方法操作。策略模式是模式的使用者必须先创建好对象,将该对象作为参数传进去,然后通过该对象调用相应... 查看详情

golang如何体现面向对象三大特征之多态?(代码片段)

多态基本介绍快速入门接口体现多态的两种形式多态参数多态数组基本介绍变量(实例)具有多种形态。面向对象的三大特征,在Go语言,多态特征是通过接口实现的。可以按照统一的接口来调用不同的实现。这... 查看详情

golang自定义接口和实现接口(代码片段)

1/*2定义:3type接口名interface4方法名(可选:参数列表)可选:返回值列表||(可选:返回值列表)56例:typeWriterinterface7Write(p[]byte)(nint,errerror)89typeObjecterinterface//定义接口10say(classint,valuestring)(bbool,errerror)1112实现接口:131:接口的方法与实现接口... 查看详情

有效的括号golang实现(代码片段)

...括‘(‘,‘)‘,‘‘,‘‘,‘[‘,‘]‘的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。输入:"()"输出:true输... 查看详情

golang判断是否为zip文件(代码片段)

文章目录1.压缩文件格式2.判断是否ZIP文件3.go-huge-util参考文献1.压缩文件格式压缩文件格式多如牛毛,但常见的有4种。ZIPZIP是一个历史悠久的压缩格式,也是事实上的压缩文件格式标准。ZIP是一个开放的压缩文件格式ÿ... 查看详情

java示例代码_判断TypeElement是否间接实现了接口

java示例代码_判断TypeElement是否间接实现了接口 查看详情

golang学习随便记8(代码片段)

...为它遵守了接口约定)。和常见的OOP语言不同,golang的接口是隐式实现的,一个类型并不会显式声明它实现了哪种接口,而是直接提供接口所必需的方法。这种方式让我们可以不改变已有类型的实现,就可以... 查看详情