当前位置: 首页 > 后端技术 > PHP

新的Go关键字any,interface{}会成为历史吗?

时间:2023-03-30 05:46:34 PHP

大家好,我是炸鱼。当你查看Go1.18泛型的代码时,你可能已经注意到了一个新的关键字any。一个例子如下:funcPrint[Tany](s[]T){}之前没提过,但是有没有人认为这个关键字是泛型代码独有的?其实不是...在Go1.18的这次新更新中,any作为一个新的关键字出现,any有一个实体,本质上是interface{}的别名:typeany=interface{}即在常规代码中,它也可以直接使用:funcf(aany){switcha.(type){caseint:fmt.Println("炸鱼入脑")casefloat64:fmt.Println("炸鱼入脑没了")casestring:fmt.Println("大脑是炸鱼")}}funcmain(){f(2)f(3.1415)f("炸鱼不错!")}从使用的角度来说,new关键字any比interface{}方便多了。毕竟省了很多字,速度也更快。其实也是基于现有的符文类型。添加新关键字后的对比如下:longdeclarationshortdeclarationfuncfTinterface{}[]TfuncfTany[]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,实现代码一致性。这种变化似乎是一个审美问题,你怎么看?你想要一个别名吗?欢迎在评论区留言交流:)如有任何问题,欢迎在评论区反馈交流。最好的关系是相互成就。您的好评是炸鱼创作最大的动力。感谢您的支持。文章持续更新中。可以微信搜索【脑补炸鱼】阅读。本文已收录在GitHubgithub.com/eddycjy/blog中。学习Go语言可以看Go学习地图和路线。欢迎星星提醒。