登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-03-22 20:49:51 113浏览 收藏

golang学习网今天将给大家带来《Golang如何为未知接口做类型断言?》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到golang等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

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

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函数内部,你永远不会知道实际传递的是什么类型的对象,那么如何完成类型断言呢?

正确答案

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

你有一些静态类型的变量s,它有类型t。如果您尝试像使用其他类型一样使用它,编译器会通过拒绝编译来强制执行s始终具有类型的保证,因为这会破坏保证。t``s

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

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

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

终于介绍完啦!小伙伴们,这篇关于《Golang如何为未知接口做类型断言?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表