为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
德玛西亚99 2021-09-09 21:43:47
我尝试转换interface{}为结构person...package mainimport (    "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.
查看完整描述

2 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

处理此问题的常用方法是将指向输出值的指针传递给解码辅助函数。这避免了应用程序代码中的类型断言。


package main


import (

    "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)

}


查看完整回答
反对 回复 2021-09-09
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

你的问题是你开始创建一个空的接口,并告诉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 链接,以免造成不必要的混乱。如果你很好奇,这里有一个经过清理的版本,使其更加地道(包括对我为什么做出改变的评论)。


查看完整回答
反对 回复 2021-09-09
  • 2 回答
  • 0 关注
  • 327 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信