共计 1142 个字符,预计需要花费 3 分钟才能阅读完成。
大家好,我是煎鱼。
大家在看 Go1.18 泛型的代码时,不晓得是否有留意到一个新的关键字 any。
例子如下:
func Print[T any](s []T) {}
之前没有专门提过,但有没有小伙伴认为这个关键字,是泛型代码专属的?
其实不是 … 在这次新的 Go1.18 更新中,any 是作为一个新的关键字呈现,any 有一个真身,实质上是 interface{} 的别名:
type any = interface{}
也就是,在惯例代码中,也能够间接应用:
func f(a any) {switch a.(type) {
case int:
fmt.Println("进脑子煎鱼了")
case float64:
fmt.Println("煎鱼进脑子了")
case string:
fmt.Println("脑子进煎鱼了")
}
}
func main() {f(2)
f(3.1415)
f("煎鱼好!")
}
从应用层面来讲,新的关键字 any 会比 interface{} 不便不少,毕竟少打了好多个词,更快了,其实也是参照现有 rune 类型的做法。
减少新关键字后的比照如下:
长申明 | 短申明 |
---|---|
func fT interface{} []T | func fT any []T |
func f(a interface{}) | func f(a any) |
var a interface{} | var a any |
咱们在理解他的便利性后,再从代码一致性和可读性来讲,是有些问题的,会造成肯定的纳闷。
因而前两天有人提出了《all: rewrite interface{} to any》的需要,打算把外部所有的代码都重写一遍。
你可能会认为是人肉手工改?那必定不是,Go 官网发动了 CL 进行批量批改。
咱们在日常的工程中,也能够和他们一样,间接借用 Go 工具链来实现替换。
如下:
gofmt -w -r 'interface{} -> any' ./...
听到这个音讯时,我的敌人咸鱼就大惊了,在想 interface{} 会不会成为历史,被新的关键字 any 齐全代替?
显然,答案是不会的。因为 Go1 有兼容性的保障,必定不会在现阶段删除。不过后续会呈现一个景象,就是咱们的 Go 工程中,有人用 any,有人用 interface{},会在代码可读性上比拟伤人。
不过咱们也能够学 Go 官网,在 linter 流程中借助 gofmt 工具来强行把所有 interface{} 都替换成 any 来实现代码的一致性。
这次变更,感觉是个 美学 的问题,你对此怎么看呢?有没有也心愿哪些货色有别名,欢送大家在评论区留言和交换:)
若有任何疑难欢送评论区反馈和交换,最好的关系是相互成就 ,各位的 点赞 就是煎鱼创作的最大能源,感激反对。
文章继续更新,能够微信搜【脑子进煎鱼了】浏览,本文 GitHub github.com/eddycjy/blog 已收录,学习 Go 语言能够看 Go 学习地图和路线,欢送 Star 催更。