Golang解析YAML时遇到实习岗位值为空的问题如何解决

Golang解析YAML时遇到实习岗位值为空的问题如何解决

package main

import (
	"fmt"
	"io/ioutil"
	"log"

	"gopkg.in/yaml.v2"
)

type instanceConfig struct {
	Name    string `yaml:"Name"`
	Address string `yaml:"Address"`
	Phone   int    `yaml:"Phone"`
	WFH     bool

	Internships string `yaml:"Internships"`
}

func (c *instanceConfig) Parse(data []byte) error {
	return yaml.Unmarshal(data, c)
}

func main() {
	data, err := ioutil.ReadFile("file.yml")
	if err != nil {
		log.Fatal(err)
	}
	var config instanceConfig
	if err := config.Parse(data); err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%+v\n", config)
}

我正在尝试用Go解析YAML。遇到两个问题:

  1. 为什么必须像 yaml:"Name" 这样定义YAML中的每个映射……它不能直接将第一个项映射到第一个键吗?
  2. 我如何才能在YAML中将Internships输出为一个列表?添加 Internships list yaml:"Internships" 完全不起作用。

Name: “Arka” Address: “India” Phone: 100 WorkFromHome: true Mail: “abc@hotmail.com

Internships:

  • JournalDev
  • MNO
  • ABC
  • XYZ Education: MSc: 7.6 BSc: 8.1 XII: 9 Courses: Udemy: 15 Coursera: 3 References: “Mr. QWERTY, XYZ”

更多关于Golang解析YAML时遇到实习岗位值为空的问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

Arkaprabha_Majumdar:

为什么必须在 YAML 中为每个映射定义标签,如 yaml:"Name"……它不能直接将第一个项映射到第一个键吗?

对于内置的 JSON 库,它的工作方式正如您所描述的那样。也许 YAML 解码器的作者(目前)还没有实现这个功能。

Arkaprabha_Majumdar:

我怎样才能将 Internships 作为列表输出到 YAML 中?添加 Internships listyaml:“Internships”` 根本不起作用。

Internships []stringyaml:“Internships”` 应该完全可行。至少内置的 JSON 解码器是这样工作的。

更多关于Golang解析YAML时遇到实习岗位值为空的问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中解析YAML时,结构体标签是必要的,因为YAML解析器需要知道如何将YAML字段映射到结构体字段。对于Internships作为列表的问题,需要将类型定义为切片。

以下是修正后的代码:

package main

import (
	"fmt"
	"io/ioutil"
	"log"

	"gopkg.in/yaml.v2"
)

type instanceConfig struct {
	Name        string   `yaml:"Name"`
	Address     string   `yaml:"Address"`
	Phone       int      `yaml:"Phone"`
	WFH         bool     `yaml:"WorkFromHome"`
	Mail        string   `yaml:"Mail"`
	Internships []string `yaml:"Internships"`
	Education   map[string]float64 `yaml:"Education"`
	Courses     map[string]int     `yaml:"Courses"`
	References  string   `yaml:"References"`
}

func (c *instanceConfig) Parse(data []byte) error {
	return yaml.Unmarshal(data, c)
}

func main() {
	data, err := ioutil.ReadFile("file.yml")
	if err != nil {
		log.Fatal(err)
	}
	var config instanceConfig
	if err := config.Parse(data); err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%+v\n", config)
}

关键修改:

  1. WFH字段添加了yaml:"WorkFromHome"标签,以匹配YAML中的WorkFromHome字段
  2. Internships的类型从string改为[]string,以正确解析YAML列表
  3. 添加了Mail字段及其标签
  4. 添加了EducationCourses字段,使用map类型来解析嵌套的键值对

对于第一个问题,结构体标签是必需的,因为:

  • Go结构体字段默认使用大写字母开头,而YAML通常使用小写
  • 标签提供了明确的映射关系,避免歧义
  • 支持字段重命名(如WFH映射到WorkFromHome

对于第二个问题,Internships必须定义为切片类型[]string才能正确解析YAML列表。原来的string类型无法容纳多个值。

回到顶部