如何将接口{}转换为struct

时间:2018-06-14 07:56:50

标签: go struct casting type-conversion data-conversion

我一直在寻找如何将接口转换为结构体,但我不知道如何做到这一点。

我会尝试解释我的问题。

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
/////

2 个答案:

答案 0 :(得分:3)

使用类型断言可以执行此操作:

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”。虽然,它实际上不是“演员”,因为它称之为“转换”。

答案 1 :(得分:0)

感谢您的帮助,我解决了这个问题。

当我做断言时,我正在使用错误的结构进行投射......所以修复问题的方法是:

aux := post.Do()
aux.Response.(ResHealth)  ==> aux.Response.(test.ResHealth)

现在它正在运作。 谢谢