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

开发 后端
从使用层面来讲,新的关键字 any 会比 interface{} 方便不少,毕竟少打了好多个词,更快了,其实也是参照现有 rune 类型的做法。

[[438997]]

大家好,我是煎鱼。

在看 Go1.18 泛型的代码时,不知道是否有留意到一个新的关键字 any。

例子如下:

  1. func Print[T any](s []T) {} 

之前没有专门提过,但有没有小伙伴以为这个关键字,是泛型代码专属的?

其实不是...在这次新的 Go1.18 更新中,any 是作为一个新的关键字出现,any 有一个真身,本质上是 interface{} 的别名:

  1. type any interface{} 

也就是,在常规代码中,也可以直接使用:

  1. func f(a any) { 
  2.  switch a.(type) { 
  3.  case int
  4.   fmt.Println("进脑子煎鱼了"
  5.  case float64: 
  6.   fmt.Println("煎鱼进脑子了"
  7.  case string: 
  8.   fmt.Println("脑子进煎鱼了"
  9.  } 
  10.  
  11. func main() { 
  12.  f(2) 
  13.  f(3.1415) 
  14.  f("煎鱼好!"

从使用层面来讲,新的关键字 any 会比 interface{} 方便不少,毕竟少打了好多个词,更快了,其实也是参照现有 rune 类型的做法。

增加新关键字后的对比如下:

长声明 短声明
func f[T interface{}](s []T) []T func f[T any](s []T) []T
func f(a interface{}) func f(a any)
var a interface{} var a any

我们在了解他的便利性后,再从代码一致性和可读性来讲,是有些问题的,会造成一定的疑惑。

因此前两天有人提出了《all: rewrite interface{} to any》的需求,打算把内部所有的代码都重写一遍。

你可能会以为是人肉手工改?那肯定不是,Go 官方发起了 CL 进行批量修改。

我们在日常的工程中,也可以和他们一样,直接借用 Go 工具链来实现替换。

如下:

  1. gofmt -w -r 'interface{} -> any' ./... 

听到这个消息时,我的朋友咸鱼就大惊了,在想 interface{} 会不会成为历史,被新的关键字 any 完全替代?

显然,答案是不会的。因为 Go1 有兼容性的保证,肯定不会在现阶段删除。不过后续会出现一个现象,就是我们的 Go 工程中,有人用 any,有人用 interface{},会在代码可读性上比较伤人。

 

不过我们也可以学 Go 官方,在 linter 流程中借助 gofmt 工具来强行把所有 interface{} 都替换成 any 来实现代码的一致性。

 

责任编辑:武晓燕 来源: 脑子进煎鱼了
相关推荐

2021-12-15 10:54:12

Gogofmt命令Go源代码

2023-03-24 08:01:27

Go语言内存

2022-01-04 16:35:42

C++Protected关键字

2009-09-17 09:30:00

Linq LET关键字

2009-09-02 09:24:03

C# this关键字

2012-03-01 12:50:03

Java

2018-04-20 15:56:09

Pythonglobal关键字

2009-08-21 14:58:56

C# this关键字

2013-01-30 10:12:14

Pythonyield

2009-08-13 13:04:29

C# lock关键字

2022-06-29 08:05:25

Volatile关键字类型

2022-05-06 08:32:40

Pythonwith代码

2021-02-01 13:10:07

Staticc语言UNIX系统

2022-02-17 08:31:38

C语言staic关键字

2019-11-06 10:36:43

MavenoptionalJava

2009-08-13 17:44:34

C# using关键字

2021-08-06 07:51:47

关键字int函数

2009-08-21 14:47:59

C# base关键字

2009-08-06 17:52:23

C#增加that关键字

2019-12-20 15:19:41

Synchroinze线程安全
点赞
收藏

51CTO技术栈公众号