Go语言 any和reflect.Value有什么区别?

gopyfrb3  于 2023-11-14  发布在  Go
关注(0)|答案(1)|浏览(156)

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需要这两个?

wlsrxk51

wlsrxk511#

类型any是一个空的interface。请注意,即使任何类型都满足它,它也是静态类型的。因此,空的interface接受任何值。
但是为了使用存储在空接口中的值,你必须知道期望的类型(就像代码中的类型开关)。所以在实践中,any扮演着类型联合的角色。
另一方面,reflect.Value用于reflection。它允许您检查接口变量中存储的类型和值。这样您就可以处理未知的类型。请注意,此额外功能会带来额外的开销。

相关问题