editor php Xigua hari ini memperkenalkan anda kepada teknik yang sangat berguna - membongkar YAML ke dalam kamus dan memetakan kunci kepada atribut struktur. YAML ialah format siri data ringan yang biasa digunakan untuk fail konfigurasi dan pertukaran data. Dengan menyahmarshall YAML, kami boleh menukarnya menjadi kamus, dan kemudian memetakan kunci kamus kepada sifat struktur, menjadikannya lebih mudah untuk kami melakukan operasi dan pemprosesan selanjutnya dalam kod. Teknik ini sangat berguna apabila berurusan dengan fail konfigurasi atau memuatkan data daripada sumber data luaran Mari kita lihat kaedah pelaksanaan khusus!
Saya ada mencari di sini untuk seketika tetapi tidak menemui jawapan yang sesuai:
Saya cuba menyahmarshal kunci dict yaml pada atribut struct dan bukannya kunci yang dipetakan. Memandangkan yaml ini
commands: php: service: php bin: /bin/php node: service: node bin: /bin/node
Saya dapat membongkarnya menjadi struktur seperti ini:
type config struct { commands map[string]struct { service string bin string } }
Tetapi bagaimana saya boleh menyahbinanya menjadi struktur seperti ini:
type Config struct { Commands []struct { Name string // <-- this should be key from the yaml (i.e. php or node) Service string Bin string } }
Terima kasih terlebih dahulu atas bantuan anda
Anda boleh menulis unmarshaller tersuai seperti ini (on the go playground):
package main import ( "fmt" "gopkg.in/yaml.v3" ) var input []byte = []byte(` commands: php: service: php bin: /bin/php node: service: node bin: /bin/node `) type Command struct { Service string Bin string } type NamedCommand struct { Command Name string } type NamedCommands []NamedCommand type Config struct { Commands NamedCommands } func (p *NamedCommands) UnmarshalYAML(value *yaml.Node) error { if value.Kind != yaml.MappingNode { return fmt.Errorf("`commands` must contain YAML mapping, has %v", value.Kind) } *p = make([]NamedCommand, len(value.Content)/2) for i := 0; i < len(value.Content); i += 2 { var res = &(*p)[i/2] if err := value.Content[i].Decode(&res.Name); err != nil { return err } if err := value.Content[i+1].Decode(&res.Command); err != nil { return err } } return nil } func main() { var f Config var err error if err = yaml.Unmarshal(input, &f); err != nil { panic(err) } for _, cmd := range f.Commands { fmt.Printf("%+v\n", cmd) } }
Saya telah membahagikan data arahan kepada command
和 namedcommand
以使代码更简单,因为您只需调用 decode
即可提供嵌入的 command
nilai struct. Jika semuanya berada dalam struct yang sama, anda perlu memetakan kekunci secara manual ke medan struct.
Atas ialah kandungan terperinci Unmarshal yaml memetakan kunci dict kepada sifat struktur. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!