any
似乎是一个动态类型的值:你可以在运行时查询类型。同样适用于reflect.Value
:
package main
import (
"fmt"
"reflect"
)
func gettype(a any) string {
switch a.(type) {
case string:
return "string"
case int:
return "int"
default:
panic("todo")
}
}
func main() {
var a any
a = "abc"
fmt.Printf("%v %v\n", a, gettype(a))
a = 42
fmt.Printf("%v %v\n", a, gettype(a))
var v reflect.Value
v = reflect.ValueOf("abc")
fmt.Printf("%v %v\n", v, v.Type())
v = reflect.ValueOf(42)
fmt.Printf("%v %v\n", v, v.Type())
}
字符串
为什么Go需要这两个?
1条答案
按热度按时间wlsrxk511#
类型
any
是一个空的interface
。请注意,即使任何类型都满足它,它也是静态类型的。因此,空的interface
接受任何值。但是为了使用存储在空接口中的值,你必须知道期望的类型(就像代码中的类型开关)。所以在实践中,
any
扮演着类型联合的角色。另一方面,
reflect.Value
用于reflection。它允许您检查接口变量中存储的类型和值。这样您就可以处理未知的类型。请注意,此额外功能会带来额外的开销。