Go 1.18 中的“any”类型是什么?

IT小君   2022-11-11T00:10:21

在 Visual Studio Code 中,自动完成工具(我猜是gopls?)提供了以下模板:

m.Range(func(key, value any) bool {
    
})

哪里msync.Map该类型any无法识别,但被放在那里。

是什么any我可以放我想要的类型并希望 Go 1.18 为我做隐式类型转换吗?例如:

m.Range(func(k, v string) { ... })

哪个将作为回调中的字符串给出kv而不必自己进行类型转换?

评论(1)
IT小君

any是一个新的预声明标识符和 . 的类型别名interface{}

它来自issue 49884 、CL 368254commit 2580d0e

该问题提到了interface{}/ any

这不是一个特殊的设计,而是 Go 类型声明语法的逻辑结果。

您可以使用具有多个方法的匿名接口:

func f(a interface{Foo(); Bar()}) {
   a.Foo()
   a.Bar()
}

类似于如何在需要类型的任何地方使用匿名结构:

func f(a struct{Foo int; Bar string}) {
   fmt.Println(a.Foo)
   fmt.Println(a.Bar)
}

一个空接口恰好匹配所有类型,因为所有类型至少有零个方法。如果您想保持一致/不想引入特殊情况,
删除将意味着从语言中删除所有界面功能。interface{}

2022-11-11T00:10:21   回复