Rumah > pembangunan bahagian belakang > Golang > Tidak dapat mengekstrak pasangan kunci/nilai daripada peta yang diperoleh melalui YAML

Tidak dapat mengekstrak pasangan kunci/nilai daripada peta yang diperoleh melalui YAML

王林
Lepaskan: 2024-02-08 23:40:29
ke hadapan
390 orang telah melayarinya

无法从通过 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.

Kandungan soalan

Saya menggunakan pakej goldmark-meta untuk membaca fail yaml. Apa yang saya minat ialah ini Dalam yaml:

burger:
- a: ay
- b: bee
- c: see
Salin selepas log masuk

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 ""
}
Salin selepas log masuk
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]
Salin selepas log masuk

Bagaimana untuk mendapatkan rentetan kunci dan nilai?

Penyelesaian

Dalam data yaml anda, anda mempunyai item dalam kunci (burger),其值是映射列表(每个映射都有一个键)。我们可以像这样迭代 burger:

b, ok := c.pagefm["burger"].([]interface{})
if !ok {
  return ""
}

for _, item := range burger {
  ...
}
Salin selepas log masuk

Untuk setiap item kita boleh mengulangi kekunci dan nilai yang tersedia:

for _, item := range burger {
  for k, v := range item.(map[interface{}]interface{}) {
    ...
  }
}
Salin selepas log masuk

Kita boleh guna fmt.sprintfinterface{} 中的键和值转换为 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)
  }
}
Salin selepas log masuk

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)
        }
    }
}
Salin selepas log masuk

Apakah output:

key a value ay
key b value bee
key c value see
Salin selepas log masuk

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!

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan