package main
import (
"encoding/json"
"fmt"
"reflect"
"unsafe"
)
type Stu struct {
Name string `json:"name"`
}
func MakeStu() interface{} {
return Stu{
Name: "Test",
}
}
func main() {
jsonData := []byte(`{"name":"New"}`)
t1 := MakeStu()
t2 := MakeStu()
t3 := MakeStu()
json.Unmarshal(jsonData, &t1)
fmt.Println(t1) //Type of t1 becomes map[string]interface{} instead of struct Stu
newPointer := reflect.New(reflect.ValueOf(t2).Type()).Interface()
json.Unmarshal(jsonData, newPointer)
fmt.Println(newPointer) //It works,but it need allocate memory to hold temp new variable
brokenPointer := reflect.NewAt(reflect.ValueOf(t3).Type(), unsafe.Pointer(&t3)).Interface()
json.Unmarshal(jsonData, brokenPointer)
fmt.Println(brokenPointer) // I want to get the pointer of original type based on the existed variable t3,but it crashes.
}
If I don't know the concrete type of the interface{} when coding,I can't use interface.(Type) to cast. so how to use reflect.NewAt on interface{}?
Aucun commentaire:
Enregistrer un commentaire