You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言YAML反序列化:是否支持通过结构体标签映射嵌套字段?

实现YAML嵌套字段到顶层结构体的扁平化映射

你需要无需定义嵌套结构体,直接通过YAML标签路径将嵌套字段映射到顶层结构体属性,以下是可支持该功能的Go YAML库及实现方式:

支持路径标签的YAML库:gopkg.in/yaml.v3

gopkg.in/yaml.v3(即官方维护的github.com/go-yaml/yaml)从v3版本开始原生支持通过点分隔的路径语法在结构体标签中指定嵌套字段,完全符合你的需求,无需自定义反序列化逻辑。

正确的结构体写法

你之前的示例存在语法错误,字段必须指定类型,正确写法如下:

type Person struct {
    Name          string `yaml:"name"`
    FavouriteBook string `yaml:"favourites.book"`
    FavouriteMovie string `yaml:"favourites.movie"`
}

反序列化示例代码

package main

import (
    "fmt"
    "gopkg.in/yaml.v3"
)

type Person struct {
    Name          string `yaml:"name"`
    FavouriteBook string `yaml:"favourites.book"`
    FavouriteMovie string `yaml:"favourites.movie"`
}

func main() {
    yamlContent := `name: pamela
favourites: 
  book: the-lion-the-witch-and-the-wardrobe
  movie: barbie`

    var p Person
    err := yaml.Unmarshal([]byte(yamlContent), &p)
    if err != nil {
        panic(err)
    }

    fmt.Printf("Name: %s\nFavourite Book: %s\nFavourite Movie: %s\n", p.Name, p.FavouriteBook, p.FavouriteMovie)
}

运行代码后会输出:

Name: pamela
Favourite Book: the-lion-the-witch-and-the-wardrobe
Favourite Movie: barbie

补充说明

目前主流Go YAML库中,只有yaml.v3原生支持这种路径标签映射。yaml.v2不支持该功能,若坚持使用v2版本才需要自定义反序列化,但v3的方案显然更简洁直接。

内容的提问来源于stack exchange,提问作者Pamela Kelly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:42:37