使用gopkg.in/yaml.v3解析带短横线的YAML序列时出错
解决gopkg.in/yaml.v3解析带短横线的嵌套序列问题
你的问题核心是YAML结构与Go结构体类型不匹配:
错误原因
看你提供的YAML,server_groups是一个嵌套序列(序列里再包含序列):
server_groups: - [r1, r2, r3] # 这里的短横线表示server_groups是一个数组,数组的每个元素又是一个字符串序列
但你在Go结构体里把ServerGroups定义为[]string(一维字符串数组),yaml.v3无法将一个序列(!!seq)解析为单个字符串,因此抛出cannot unmarshal !!seq into string错误。
修正方案
把ServerGroups的类型改为[][]string(二维字符串数组),匹配YAML的嵌套序列结构:
修正后的完整代码:
package main import ( "fmt" "os" "gopkg.in/yaml.v3" ) type S struct { Servers []struct { ServerName string `yaml:"server_name"` ServerGroups [][]string `yaml:"server_groups"` } `yaml:"servers"` } func main() { file, err := os.ReadFile("example2.yaml") if err != nil { panic(err) } var s S err = yaml.Unmarshal(file, &s) if err != nil { panic(err) } // 验证解析结果 fmt.Printf("First server's first group: %#v\n", s.Servers[0].ServerGroups[0]) fmt.Printf("Second server's groups: %#v\n", s.Servers[1].ServerGroups) }
额外说明
如果你原本期望server_groups是一维字符串列表(不需要外层短横线),那YAML应该写成:
server_groups: [r1, r2, r3]
此时结构体用[]string类型才是正确的。
内容的提问来源于stack exchange,提问作者André
相关产品推荐
相关产品推荐

