Gambaran Keseluruhan Masalah
Menambah medan sewenang-wenangnya pada output JSON boleh dicapai dengan memanjangkan struct dikenali secara tanpa nama. Walau bagaimanapun, pendekatan ini terhad apabila berurusan dengan struct atau antara muka yang tidak diketahui. Artikel ini meneroka penyelesaian kepada cabaran ini.
Penyelesaian 1: Penjanaan Jenis Dinamik menggunakan Refleksi
Satu penyelesaian melibatkan penjanaan jenis dinamik pada masa jalan menggunakan pakej reflect. Jenis baharu ini ialah struct dengan medan tanpa nama bagi jenis antara muka yang dibalut dan medan tambahan untuk nilai tambahan. Dengan memikirkan nilai dan menetapkan medan dengan sewajarnya, kita boleh memperoleh output JSON yang diingini.
func printInterface(val interface{}) { // Create a new struct type with anonymous field for the interface t2 := reflect.StructOf([]reflect.StructField{ {Name: "X", Anonymous: true, Type: reflect.TypeOf(val)}, {Name: "Extra", Type: reflect.TypeOf("")}, }) // Create a new value of the dynamic type v2 := reflect.New(t2).Elem() // Set the value of the anonymous field to the input interface v2.Field(0).Set(reflect.ValueOf(val)) // Set the extra field to the desired value v2.FieldByName("Extra").SetString("text") json.NewEncoder(os.Stdout).Encode(v2.Interface()) }
Penyelesaian 2: Marshaling dan Unmarshaling
Sebagai alternatif, kita boleh marshal nilai ke JSON, unmarshal ke dalam peta, tambah medan tambahan dan marshal hasilnya sekali lagi.
func printInterface(val interface{}) error { // Marshal the value to JSON data, err := json.Marshal(val) if err != nil { return err } // Unmarshal the JSON into a map v2 := map[string]interface{}{} if err := json.Unmarshal(data, &v2); err != nil { return err } // Add the extra field v2["Extra"] = "text" // Marshal the map to JSON return json.NewEncoder(os.Stdout).Encode(v2) }
Perbandingan Penyelesaian
Penyelesaian berasaskan pantulan menjana jenis baharu khusus untuk antara muka yang diberikan, menghasilkan pendekatan yang lebih disesuaikan dan berpotensi lebih pantas . Penyelesaian marshaling dan unmarshaling adalah lebih mudah tetapi lebih perlahan kerana langkah marshaling tambahan. Susunan medan dalam output JSON juga mungkin berbeza dalam pendekatan yang terakhir.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memanjangkan Output JSON dengan Struktur Tidak Diketahui dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!