不能在赋值中使用 type interface {} 作为 type person:需要类型断言

我尝试转换interface{}为结构person...


package main


import (

    "encoding/json"

    "fmt"

)


func FromJson(jsonSrc string) interface{} {

    var obj interface{}

    json.Unmarshal([]byte(jsonSrc), &obj)


    return obj

}


func main() {


    type person struct {

        Name string

        Age  int

    }

    json := `{"Name": "James", "Age": 22}`


    actualInterface := FromJson(json)


    fmt.Println("actualInterface")

    fmt.Println(actualInterface)


    var actual person


    actual = actualInterface // error fires here -------------------------------


    // -------------- type assertion always gives me 'not ok'

    // actual, ok := actualInterface.(person)

    // if ok {


    //  fmt.Println("actual")

    //  fmt.Println(actual)

    // } else {

    //  fmt.Println("not ok")

    //  fmt.Println(actual)

    // }

}

...但有错误:


cannot use type interface {} as type person in assignment: need type assertion

为了解决这个错误,我尝试使用类型断言,actual, ok := actualInterface.(person)但总是得到not ok.


德玛西亚99
浏览 328回答 2
2回答

慕码人2483693

处理此问题的常用方法是将指向输出值的指针传递给解码辅助函数。这避免了应用程序代码中的类型断言。package mainimport (    "encoding/json"    "fmt")func FromJson(jsonSrc string, v interface{}) error {    return json.Unmarshal([]byte(jsonSrc), v)}func main() {    type person struct {        Name string        Age  int    }    json := `{"Name": "James", "Age": 22}`    var p person    err := FromJson(json, &p)    fmt.Println(err)    fmt.Println(p)}

一只斗牛犬

你的问题是你开始创建一个空的接口,并告诉json.Unmarshal解组它。虽然您已经定义了一个person类型,json.Unmarshal但无法知道这就是您想要的 JSON 类型。要解决此问题,请将 的定义person移至顶层(即,将其从main), and changeFromJson`的主体移至此:func FromJson(jsonSrc string) interface{} {    var obj person{}    json.Unmarshal([]byte(jsonSrc), &obj)    return obj}现在,当您 return 时obj,interface{}返回的 将person作为其基础类型。您可以在Go Playground上运行此代码。顺便说一句,你的代码有点不习惯。除了我的更正外,我没有修改原始的 Playground 链接,以免造成不必要的混乱。如果你很好奇,这里有一个经过清理的版本,使其更加地道(包括对我为什么做出改变的评论)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go