我一直在寻找如何将接口转换为结构,但我不知道我怎么做不到。
我会尽力解释我的问题。
type Result struct {
Http_code int
Http_msg string
Response interface{}}
该结构由向服务器发出 HTTP 请求的函数返回,另一方面,我有不同类型的结构来包装响应。
这就是我想要转换接口的结构。
type ResHealth struct {
Type string
Get_health struct {
Healthy bool
}}
我的问题是,当我尝试做出断言时,我总是遇到段冲突或程序无法编译。
工作流程是:
package test
type Result struct {
Http_code int
Http_msg string
Response interface{}
}
type ResHealth struct {
Type string
Get_health struct {
Healthy bool
}
}
func Do() Result {
var http_response Result
var health ResHealth
+++do something+++
http_response.Response = health
return http_response
}
package Test2
aux := post.Do()
aux.Response.(ResHealth) // here I have either segment violation or the program doesn't compile
/////
使用类型断言你可以这样做:
package main
import (
"fmt"
)
type I interface {
F()
}
type C struct {
}
func (_ *C) F() {}
func main() {
var i I = &C{}
var c *C = i.(*C)
fmt.Println(c)
}
像这样的类型断言的主要问题是它们不安全,这意味着如果类型在运行时无法正确“断言”,它将出现恐慌。这太糟糕了。特别是对于诸如函数返回位置之类的事情error
但返回一个具体的错误类型来为您提供更多信息,但是当您使用这样的类型断言时,您必须希望开发人员永远不会更改具体的错误类型,否则您将来会遇到意外的运行时恐慌(因为程序仍然会建造)。您可以通过使用安全类型断言来部分缓解这种情况:
func main() {
var i interface{} = &D{}
c, ok := i.(*C)
if ok {
fmt.Println(c)
} else {
fmt.Println("oops")
}
}
另外:不要将类型转换与类型断言混淆。它们不是同一件事!
类型断言基本上只是告诉编译器“这是 X”而不是“将其转换为 X”。类型转换是指“将其转换为 X”。虽然,它实际上并不是“转换”,因为 go 称它们为“转换”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)