nicht verwenden, geben Sie interface {} als Typ person bei Belegung: brauchen Typ-assertion
Ich versuche zu konvertieren interface{}
zu struct person
...
package main
import (
"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)
//}
}
... Aber bekam die Fehlermeldung:
cannot use type interface {} as type person in assignment: need type assertion
Lösen diesen Fehler habe ich versucht zu verwenden, geben Sie die Geltendmachung actual, ok := actualInterface.(person)
kam aber immer not ok
.
Spielplatz link
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der übliche Weg, dies zu behandeln ist, übergeben Sie einen Zeiger auf die output-Wert, um Ihre Dekodierung helper-Funktion. Dies vermeidet Typ-assertions im code der Anwendung.
Dein problem ist, dass Sie erstellen eine leere Schnittstelle, um mit zu beginnen, und sagen
json.Unmarshal
zu unmarshal hinein. Während Sie definiert haben, eineperson
Typjson.Unmarshal
hat keine Möglichkeit zu wissen, dass das, was Sie beabsichtigen, den Typ des JSON zu werden. Um dies zu beheben, verschieben Sie die definition vonperson
auf der obersten Ebene (das heißt, verschieben Sie es aus dem Körper desmain), and change
FromJson " zu diesem:Nun, wenn Sie zurück
obj
, dieinterface{}
, das zurückgegeben hatperson
als seine zugrunde liegenden Typ. Sie können diesen code ausführen auf der Gehen Spielplatz.Übrigens, dein code ist ein bisschen un-idiomatisch. Ich verließ die ursprünglichen Spielplatz link unverändert, außer für meine Korrekturen so das es nicht unnötig verwirrend. Wenn du neugierig bist, hier eine version, dass aufgeräumt werden mehr idiomatische (einschließlich der Kommentare, warum ich die änderungen gemacht habe ich).