Mar*_*ill 0 struct casting type-conversion data-conversion go
我一直在寻找如何将接口转换为结构,但我不知道我怎么做不到。
我会尽力解释我的问题。
type Result struct {
Http_code int
Http_msg string
Response interface{}}
Run Code Online (Sandbox Code Playgroud)
该结构由向服务器发出 HTTP 请求的函数返回,另一方面,我有不同类型的结构来包装响应。
这是我想要转换接口的结构。
type ResHealth struct {
Type string
Get_health struct {
Healthy bool
}}
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我尝试做出断言时,我总是遇到段冲突或程序无法编译。
工作流程是:
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
/////
Run Code Online (Sandbox Code Playgroud)
使用类型断言,您可以执行以下操作:
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)
}
Run Code Online (Sandbox Code Playgroud)
像这样的类型断言的主要问题是它们是不安全的,这意味着如果不能在运行时正确地“断言”类型,它就会恐慌。这很糟糕。特别是对于函数返回error但返回具体错误类型以提供额外信息的情况,但是当您使用这样的类型断言时,您必须希望开发人员永远不会更改具体错误类型,否则您将在未来(因为该程序仍将构建)。您可以通过使用安全类型断言来部分缓解这种情况:
func main() {
var i interface{} = &D{}
c, ok := i.(*C)
if ok {
fmt.Println(c)
} else {
fmt.Println("oops")
}
}
Run Code Online (Sandbox Code Playgroud)
另外:不要将类型转换与类型断言混淆。它们不是同一件事!
类型断言基本上只是说编译器“这是 X”而不是“将其转换为 X”。类型转换是说“将此转换为 X”。虽然,它实际上并不是 go 称之为“转换”的“转换”。