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。遇到两个问题:
- 为什么必须像
yaml:"Name"这样定义YAML中的每个映射……它不能直接将第一个项映射到第一个键吗? - 我如何才能在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
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)
}
关键修改:
- 为
WFH字段添加了yaml:"WorkFromHome"标签,以匹配YAML中的WorkFromHome字段 - 将
Internships的类型从string改为[]string,以正确解析YAML列表 - 添加了
Mail字段及其标签 - 添加了
Education和Courses字段,使用map类型来解析嵌套的键值对
对于第一个问题,结构体标签是必需的,因为:
- Go结构体字段默认使用大写字母开头,而YAML通常使用小写
- 标签提供了明确的映射关系,避免歧义
- 支持字段重命名(如
WFH映射到WorkFromHome)
对于第二个问题,Internships必须定义为切片类型[]string才能正确解析YAML列表。原来的string类型无法容纳多个值。

