web-dev-qa-db-fra.com

interface {} à [] octets de conversion en golang

J'essaye de démultiplier une donnée qui est de type interface. J'ai donc besoin de convertir le type d'interface en [] octet et de le transmettre à unmarshall. j'ai essayé

  1. err := json.Unmarshal([]byte(kpi), &a) => a échoué
  2. je suis fatigué de convertir l'interface en octet en utilisant kpidata, res := kpi.([]byte) => en échec, kpidata est nil

Alors, y a-t-il un moyen de le convertir?

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

11
kish

Exemple de travail basé sur celui fourni par 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})
}

Jouer

Si vous ne transmettez pas de références, cela fonctionnera fondamentalement de la même manière:

Jouer

6
matthias krull

Dans votre exemple le code data devrait être codé en JSON (en Word simple String) vous utilisez donc Unmarshal de manière erronée:

// 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

Essayez-le sur The Go Playground et 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)
}

sortie:

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

Vous voulez démarquer , essayez donc this exemple de travail simple ([]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"}
]`

sortie:

[{Platypus Monotremata} {Quoll Dasyuromorphia}]

Travailler exemple using ([]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))
}

sortie:

{"1":"one"}

J'espère que ça aide.

4
A.R