首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在golang中的接口{}到[]字节转换

在golang中的接口{}到[]字节转换
EN

Stack Overflow用户
提问于 2018-02-27 10:36:12
回答 2查看 85.8K关注 0票数 32

我正在尝试解压缩具有接口类型的数据。因此,我需要将接口类型转换为[]byte,并将其传递给解组。我试过了

  1. err := json.Unmarshal([]byte(kpi), &a) =>失败
  2. 要将接口转换为[]byte,请使用 kpidata, res := kpi.([]byte) =>失败,kpidatanil

我们有什么办法可以改变它吗?

示例:https://play.golang.org/p/5pqQ0DQ94Dp

EN

回答 2

Stack Overflow用户

发布于 2018-02-27 10:50:04

在您的示例代码中,data应该是JSON编码的(在简单的word 字符串中),所以您使用Unmarshal的方式是错误的:

//解编组解析JSON编码的数据,并将结果//存储在v.所指向的值中,如果v为0或不是指针,// Un堵an将返回一个InvalidUnmarshalError。函数解组(数据[]字节,v接口{})错误

围棋游乐场[]string{"art", "football"}上试一试

代码语言:javascript
复制
package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    // ********************* Marshal *********************
    u := map[string]interface{}{}
    u["name"] = "kish"
    u["age"] = 28
    u["work"] = "engine"
    //u["hobbies"] = []string{"art", "football"}
    u["hobbies"] = "art"

    b, err := json.Marshal(u)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(b))

    // ********************* Unmarshal *********************
    var a interface{}
    err = json.Unmarshal(b, &a)
    if err != nil {
        fmt.Println("error:", err)
    }
    fmt.Println(a)
}

产出:

代码语言:javascript
复制
{"age":28,"hobbies":"art","name":"kish","work":"engine"}
map[name:kish work:engine age:28 hobbies:art]

您想要解组 it,所以尝试简单工作示例([]byte(kpi.(string))):

代码语言:javascript
复制
package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var kpi interface{} = st
    var a []Animal
    err := json.Unmarshal([]byte(kpi.(string)), &a)
    if err != nil {
        fmt.Println("error:", err)
    }
    fmt.Println(a)
}

type Animal struct {
    Name  string
    Order string
}

var st = `[
    {"Name": "Platypus", "Order": "Monotremata"},
    {"Name": "Quoll",    "Order": "Dasyuromorphia"}
]`

产出:

代码语言:javascript
复制
[{Platypus Monotremata} {Quoll Dasyuromorphia}]

工作示例使用([]byte(*kpi.(*string))):

代码语言:javascript
复制
package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var kpi interface{} = &st
    var a []Animal
    err := json.Unmarshal([]byte(*kpi.(*string)), &a)
    if err != nil {
        fmt.Println("error:", err)
    }
    fmt.Println(a)
}

type Animal struct {
    Name  string
    Order string
}

var st = `[
    {"Name": "Platypus", "Order": "Monotremata"},
    {"Name": "Quoll",    "Order": "Dasyuromorphia"}
]`

元帅

代码语言:javascript
复制
package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    u := map[string]interface{}{}
    u["1"] = "one"
    b, err := json.Marshal(u)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(b))
}

产出:

代码语言:javascript
复制
{"1":"one"}

我希望这能帮到你。

票数 21
EN

Stack Overflow用户

发布于 2018-02-27 11:26:31

基于Kugel提供的实例:

代码语言:javascript
复制
package main

import (
    "fmt"
)

func passInterface(v interface{}) {
    b, ok := v.(*[]byte)
    fmt.Println(ok)
    fmt.Println(b)
}

func main() {
    passInterface(&[]byte{0x00, 0x01, 0x02})
}

如果不传递引用,它的工作原理基本相同:

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49006594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档