Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mencantumkan Struktur Go dengan Cekap Sambil Mengutamakan Nilai Tertentu?

Bagaimana untuk Mencantumkan Struktur Go dengan Cekap Sambil Mengutamakan Nilai Tertentu?

Barbara Streisand
Lepaskan: 2024-11-29 21:03:10
asal
395 orang telah melayarinya

How to Efficiently Merge Go Structs While Prioritizing Specific Values?

Menggabungkan Medan Struktur Dengan Cekap

Masalah

Pertimbangkan struct Config dengan berbilang medan. Anda mempunyai dua struct jenis ini, DefaultConfig dengan nilai lalai dan FileConfig dimuatkan daripada fail. Matlamatnya adalah untuk menggabungkan struct ini, memberi keutamaan kepada nilai dalam FileConfig sambil mengekalkan medan yang tidak ditetapkan.

Penyelesaian Berasaskan Refleksi

Satu pendekatan melibatkan penggunaan refleksi untuk membandingkan nilai medan dan mengemas kini secara terpilih mereka dalam DefaultConfig :

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, kaedah ini memerlukan pengendalian nilai sifar dengan teliti, kerana ia boleh membawa kepada penulisan ganti yang tidak diingini.

Pengekodan/Penyelesaian Berasaskan JSON

Penyelesaian yang lebih elegan dan sifar usaha menggunakan pakej pengekodan/json:

import (
  "encoding/json"
  "io/ioutil"
)

var defConfig = &Config{
  S1: "def1",
  S2: "def2",
  S3: "def3",
}

func main() {
  fileContent, err := ioutil.ReadFile("config.json")
  if err != nil {
    panic(err)
  }

  err = json.NewDecoder(bytes.NewReader(fileContent)).Decode(&defConfig)
  if err != nil {
    panic(err)
  }

  fmt.Printf("%+v", defConfig)
}
Salin selepas log masuk

Dengan pendekatan ini:

  • Nilai yang tiada dalam config.json akan mengekalkan nilai lalai.
  • Nilai dalam config.json akan mengatasi nilai lalai, walaupun ia ditetapkan kepada sifar.
  • Nilai sifar eksplisit dalam config.json akan menimpa nilai lalai bukan sifar.

Atas ialah kandungan terperinci Bagaimana untuk Mencantumkan Struktur Go dengan Cekap Sambil Mengutamakan Nilai Tertentu?. 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