Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Menggabungkan Struktur Go dari Jenis Yang Sama Dengan Cekap Menggunakan Pengekodan JSON?

Bagaimanakah Saya Boleh Menggabungkan Struktur Go dari Jenis Yang Sama Dengan Cekap Menggunakan Pengekodan JSON?

Patricia Arquette
Lepaskan: 2024-11-28 08:50:10
asal
754 orang telah melayarinya

How Can I Efficiently Merge Go Structs of the Same Type Using JSON Encoding?

Gabungkan Medan Struktur Identik dengan Pengekodan JSON

Dalam bidang pengaturcaraan Go, tugas menggabungkan medan daripada dua struktur yang sama jenis timbul dengan kerap. Pertimbangkan senario di mana anda mempunyai konfigurasi lalai, seperti:

type Config struct {
  path string
  id   string
  key  string
  addr string
  size uint64
}

var DefaultConfig = Config{"", "", "", "", 0}
Salin selepas log masuk

Dan konfigurasi yang dimuatkan daripada fail, seperti:

var FileConfig = Config{"", "file_id", "", "file_addr", 0}
Salin selepas log masuk

Objektif anda adalah untuk menggabungkan kedua-dua konfigurasi ini supaya hasilnya mempunyai nilai daripada kedua-dua struct, dengan FileConfig menimpa sebarang nilai dalam DefaultConfig. Walau bagaimanapun, FileConfig mungkin tidak mengandungi semua medan.

Pada asalnya, anda memikirkan menggunakan refleksi untuk tugasan ini:

func merge(default *Config, file *Config) (*Config) {
  b := reflect.ValueOf(default).Elem()
  o := reflect.ValueOf(file).Elem()

  for i := 0; i < b.NumField(); i++ {
    defaultField := b.Field(i)
    fileField := o.Field(i)
    if defaultField.Interface() != reflect.Zero(fileField.Type()).Interface() {
     defaultField.Set(reflect.ValueOf(fileField.Interface()))
    }
  }

  return default
 }
Salin selepas log masuk

Walau bagaimanapun, dalam keadaan ini, refleksi bukanlah penyelesaian yang optimum. Pendekatan yang lebih elegan adalah untuk memanfaatkan kuasa pakej pengekodan/json.

Pakej pengekodan/json menyediakan mekanisme mudah untuk menyahmarshal data JSON ke dalam struktur Go yang dipratentukan. Dengan menggunakan teknik ini, anda boleh menggabungkan konfigurasi anda dengan elegan:

import (
  "encoding/json"
  "strings"
)

const fileContent = `{"id":"file_id","addr":"file_addr","size":100}`

func unmarshalConfig(conf *Config, content string) error {
  return json.NewDecoder(strings.NewReader(content)).Decode(conf)
}

func mergeConfigs(defConfig *Config, fileConfig *Config) error {
  if err := unmarshalConfig(defConfig, fileContent); err != nil {
    return err
  }
  
  for _, v := range fileConfig {
    defConfig[v.key] = v.value
  }
  
  return nil
}
Salin selepas log masuk

Dalam penyelesaian ini, fileConfig dipisahkan ke dalam konfigurasi lalai. Pakej pengekodan/json mengendalikan semua kerumitan menetapkan nilai medan, termasuk nilai yang hilang (yang akan menjadi lalai kepada nilai sifarnya) dan nilai yang ditentukan fail yang mengatasi nilai lalai.

Dengan menggunakan unmarshaling, anda mencapai yang mudah dan penyelesaian yang cekap untuk menggabungkan struktur daripada jenis yang sama, memastikan medan FileConfig yang ditetapkan akan diutamakan daripada nilai lalai.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggabungkan Struktur Go dari Jenis Yang Sama Dengan Cekap Menggunakan Pengekodan JSON?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan