Rumah > Artikel > pembangunan bahagian belakang > Tidak dapat mengekstrak pasangan kunci/nilai daripada peta yang diperoleh melalui YAML
editor php Xiaoxin sering menghadapi masalah apabila menggunakan YAML untuk mendapatkan pemetaan, iaitu pasangan kunci/nilai tidak boleh diekstrak daripada pemetaan yang diperoleh melalui YAML. Masalah ini sangat biasa dalam pembangunan sebenar, dan ia mungkin menyebabkan fail konfigurasi tidak dapat dibaca dengan betul atau data yang betul diperolehi. Dalam artikel ini, kami akan menyelidiki punca masalah ini dan menyediakan beberapa penyelesaian untuk membantu pembangun mengekstrak pasangan kunci/nilai dengan lebih lancar apabila menggunakan YAML.
Saya menggunakan pakej goldmark-meta untuk membaca fail yaml. Apa yang saya minat ialah ini Dalam yaml:
burger: - a: ay - b: bee - c: see
Saya mahu mengakses kunci dan nilai Kembali ke antara muka, saya terperangkap. Lelaran mengembalikan saya a senarai pasangan kunci/nilai, tetapi saya tidak mempunyai tahu bagaimana untuk mendapatkan maklumat apabila saya tidak tahu Ketahui nama kunci lebih awal. Program ini mencetak perkara berikut:
func (c *config) burger() string { // c.pagefm is type map[string]interface{} b, ok := c.pagefm["burger"].([]interface{}) if !ok { // no burger entry in yaml return "" } debug("burger list has %v items:\n%v", len(b), b) debug("type: %v", reflect.typeof(b)) for i := 0; i < len(b); i++ { debug("%v", b[i]) } return "" }
Burger list has 3 items: [map[a:ay] map[b:bee] map[c:see]] Type: []interface {} map[a:ay] map[b:bee] map[c:see]
Bagaimana untuk mendapatkan rentetan kunci dan nilai?
Dalam data yaml anda, anda mempunyai item dalam kunci (burger
),其值是映射列表(每个映射都有一个键)。我们可以像这样迭代 burger
:
b, ok := c.pagefm["burger"].([]interface{}) if !ok { return "" } for _, item := range burger { ... }
Untuk setiap item
kita boleh mengulangi kekunci dan nilai yang tersedia:
for _, item := range burger { for k, v := range item.(map[interface{}]interface{}) { ... } }
Kita boleh guna fmt.sprintf
将 interface{}
中的键和值转换为 string
:
for _, item := range burger { for k, v := range item.(map[interface{}]interface{}) { k_str := fmt.sprintf("%v", k) v_str := fmt.sprintf("%v", v) fmt.printf("key %s value %s\n", k_str, v_str) } }
Bermula dengan kod contoh goldmark-meta
daripada , saya kumpulkan contoh ini:
package main import ( "bytes" "fmt" "github.com/yuin/goldmark" meta "github.com/yuin/goldmark-meta" "github.com/yuin/goldmark/parser" ) func main() { markdown := goldmark.new( goldmark.withextensions( meta.meta, ), ) source := `--- burger: - a: ay - b: bee - c: see --- # hello goldmark-meta ` var buf bytes.buffer context := parser.newcontext() if err := markdown.convert([]byte(source), &buf, parser.withcontext(context)); err != nil { panic(err) } metadata := meta.get(context) burger := metadata["burger"].([]interface{}) for _, item := range burger { for k, v := range item.(map[interface{}]interface{}) { k_str := fmt.sprintf("%v", k) v_str := fmt.sprintf("%v", v) fmt.printf("key %s value %s\n", k_str, v_str) } } }
Apakah output:
key a value ay key b value bee key c value see
Atas ialah kandungan terperinci Tidak dapat mengekstrak pasangan kunci/nilai daripada peta yang diperoleh melalui YAML. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!