5

ここにコードがあります

package main

import (
    "fmt"

    "encoding/json"
    "reflect"
)

var (
    datajson []byte
    //ref mapp
)

type mapp map[string]reflect.Type

type User struct {
    Name string
    //Type map[string]reflect.Type
}

func MustJSONEncode(i interface{}) []byte {
    result, err := json.Marshal(i)
    if err != nil {
        panic(err)
    }
    return result
}
func MustJSONDecode(b []byte, i interface{}) {
    err := json.Unmarshal(b, i)
    if err != nil {
        panic(err)
    }

}
func Store(a interface{}) {
    datajson = MustJSONEncode(a)
    //fmt.Println(datajson)
}

func Get(a []byte, b interface{}) {
    objType := reflect.TypeOf(b).Elem()
obj := reflect.New(objType)
//fmt.Println(obj)
MustJSONDecode(a, &obj)
fmt.Printf("%s", obj)
    }

func main() {

    dummy := &User{}
    david := User{Name: "DavidMahon"}

    Store(david)
    Get(datajson, dummy)

}

Get 関数で

func Get(a []byte, b interface{}) {
    objType := reflect.TypeOf(b).Elem()
obj := reflect.New(objType)
//fmt.Println(obj)
MustJSONDecode(a, &obj)
fmt.Printf("%s", obj)
    }

json を基になるオブジェクト タイプにアンマーシャリングできません。

ここで何が問題なのですか?私はここで立ち往生しています。非常にシンプルでありながら、理解するのが非常に難しいもの。

ありがとう

UPDATE :: この問題の目的は、Get 関数で渡された型の完全に形成されたオブジェクトを取得することです。

以下のコメントでニックが言及したアプローチは、私が以前に試した実際のオブジェクトを取得しません。とにかく、このようなマップでデータを取得できます(オブジェクトの下に再帰オブジェクトがある場合でも)

func Get(a []byte) {
    var f interface{}

    //buf := bytes.NewBuffer(a)
    //v := buf.String()
    //usr := &User{}

    MustJSONDecode(a, &f)
    fmt.Printf("\n %v \n", f)
}

ただし、データだけでなく実際のオブジェクトが必要です。Unmarshall からオブジェクトを返すuser := &User{"SomeName"}必要がある場所のようなものです。userトリックは反射のどこかにありますが、方法がわかりません。

4

2 に答える 2

1

reflect.New(objType)reflect.Value渡したインターフェースとは違うものを返します。Valueのドキュメントによると、エクスポートされていないフィールドのみを持つ構造体です。json パッケージは、エクスポートされていないフィールドでは機能しません。渡したのと同じオブジェクトではなく、json エンコード可能/デコード可能でさえないため、json パッケージは失敗します。

Reflect パッケージを使用しようとしているときに、「反射の法則」の記事が役立つことがわかるでしょう。

于 2013-08-18T03:46:16.803 に答える