web-dev-qa-db-ja.com

インターフェイス{}からgolangの[]バイトへの変換

インターフェイス型のデータを非整列化しようとしています。そのため、インターフェイスタイプを[] byteに変換し、アンマーシャルに渡す必要があります。私は試した

  1. err := json.Unmarshal([]byte(kpi), &a) =>失敗
  2. kpidata, res := kpi.([]byte) => failedを使用してインターフェイスをバイトに変換するのにうんざりしました。kpidataはnilです

変換できる方法はありますか?

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

11
kish

Kugelが提供するものに基づいた実例:

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

再生

参照を渡さない場合、基本的に同じように機能します。

再生

6
matthias krull

sample code dataJSON-encoded(単純なWordString)したがって、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
_

Go Playground および this:_[]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]
_

あなたはUnmarshalそれをしたいので、試してください 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}]
_

動作中 []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"}
]`
_

元s

_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"}
_

これがお役に立てば幸いです。

4
A.R