如何将 interface {} 转换为 struct

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)

mro*_*man 9

使用类型断言,您可以执行以下操作:

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 称之为“转换”的“转换”。