gpt4 book ai didi

Golang如何为未知接口(interface)做类型断言?

转载 作者:IT老高 更新时间:2023-10-28 13:10:30 26 4
gpt4 key购买 nike

我知道我可以通过反射获取对象的值,然后使用类型断言来取回实际对象:

obj := new(User)
out := reflect.ValueOf(obj).Elem().Interface().(User)
fmt.Println(out == *obj) // true

但是如果我不知道对象的类型是User,我该如何进行类型断言呢?假设它在一个函数中,例如:

func Foo(obj interface{}) bool {
// out := reflect.ValueOf(obj).Elem().Interface().( ... )
return out == *obj
}

func main() {
obj := new(User)
fmt.Println(Foo(obj))
}

Foo 函数中,你永远不会知道实际传递的是什么类型的对象,那么如何完成类型断言?

最佳答案

你不能。类型断言允许您利用语言为您提供的静态类型检查,即使您有一个未静态检查其类型的接口(interface)。它基本上是这样工作的:

你有一些静态类型变量s,它的类型是t。编译器强制保证 s 始终具有类型 t 如果您尝试使用 s 就好像它是不同的类型一样拒绝编译,因为那样会破坏保证。

你还有一些接口(interface)变量,ii 的类型在编译时是未知的,因此编译器无法保证将 i 分配给 s 不会中断s 具有类型 t 的保证。但是,您可以做的是类型断言。类型断言通过说:“好吧,我将在运行时检查,并且我只会在类型匹配时才进行分配”来回避这个问题。编译器对此没问题,因为它知道只有在类型匹配时才会发生赋值,这意味着它仍然可以保证 s 具有类型 t。所以基本上运行时发生的事情是:

if (i has type t) {
s = i
} else {
s = t{} // Zero value of t
}

你所要求的不可能的原因是编译器必须知道你正在检查什么类型,以便它可以编写我为上面提供的伪代码的检查。不知道t是什么,就无法知道s的静态类型应该是什么,也无法检查是否正确。

关于Golang如何为未知接口(interface)做类型断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21495810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com