接口{}在golang []字节转换

问题描述 投票:10回答:2

我试图解组一个类型接口的数据。所以我需要将接口类型转换为[] byte并将其传递给unmarshall。我试过了

  1. err := json.Unmarshal([]byte(kpi), &a) =>失败了
  2. 我厌倦了使用kpidata, res := kpi.([]byte) =>将接口转换为字节,kpidata为零

那么我们有什么方法可以转换它吗?

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

json go
2个回答
5
投票

基于库格尔提供的工作实例:

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

Play

如果你没有传递引用,它将基本相同:

Play


3
投票

在你的sample代码中,data应该是JSON编码的(用简单的单词String),所以你使用Unmarshal的方式是错误的:

// Unmarshal parses the JSON-encoded data and stores the result
// in the value pointed to by v. If v is nil or not a pointer,
// Unmarshal returns an InvalidUnmarshalError.
func Unmarshal(data []byte, v interface{}) error

The Go Playgroundthis: []string{"art", "football"}上尝试:

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

输出:

{"age":28,"hobbies":"art","name":"kish","work":"engine"}
map[name:kish work:engine age:28 hobbies:art]

你想要解组它,所以试试this简单的工作示例([]byte(kpi.(string)):

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"}
]`

输出:

[{Platypus Monotremata} {Quoll Dasyuromorphia}]

使用(example)工作[]byte(*kpi.(*string))

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"}
]`

Marshal

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

输出:

{"1":"one"}

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.