当前位置: 首页 > 科技观察

Go的新关键字Any,Interface会成为历史吗?

时间:2023-03-11 21:39:25 科技观察

大家好,我是炸鱼。在看Go1.18泛型的代码的时候,不知道大家有没有注意到一个新的关键字any。一个例子如下:funcPrint[Tany](s[]T){}之前没有具体提到过,但是有没有人认为这个关键字是泛型代码独有的呢?实际上它不是......在这个新的Go1中。在18更新中,any作为新关键字出现。Any有实体,本质上是interface{}的别名:typeanyinterface{}即在常规代码中,也可以直接使用:funcf(aany){switcha.(type){caseint:fmt.Println("炸鱼入脑")casefloat64:fmt.Println("炸鱼入脑")casestring:fmt.Println("炸鱼入脑")}}funcmain(){f(2)f(3.1415)f("炸鱼好吃!")}从使用的角度来说,new关键字any比interface{}方便多了,毕竟省了很多话。它更快,而且它实际上是指现有的符文类型。添加新关键字后的对比如下:longstatementshortstatementfuncf[Tinterface{}](s[]T)[]Tfuncf[Tany](s[]T)[]Tfuncf(ainterface{})funcf(aany)varainterface{}varaany我们理解了它的方便性之后,在代码的一致性和可读性方面存在一些问题,会引起一定的质疑。于是前两天有人提出《all: rewrite interface{} to any》的需求,打算把内部代码全部改写。你可能会认为这是人肉手动修改的?绝对不是这样。Go正式推出CL进行批量修改。在我们日常的项目中,也可以像他们一样直接借用Go工具链来替换他们。如下:gofmt-w-r'interface{}->any'./...朋友闲鱼听到这个消息后惊呆了,想知道interface{}会不会成为历史,被新的关键字any取代是完全替代?显然,答案是否定的。因为Go1有兼容性保证,所以现阶段肯定不会删。但是,以后会有一个现象,就是在我们的Go项目中,有的人用any,有的人用interface{},这样在代码可读性上会很伤人。不过我们也可以向Go官方学习,在linter过程中使用gofmt工具,将所有interface{}强制替换为any,实现代码一致性。