yaml/go-yaml

GitHub: yaml/go-yaml

Go 语言中极受欢迎的 go-yaml 库由 YAML 官方组织接手维护的分支版本,提供可靠的 YAML 序列化与反序列化能力。

Stars: 493 | Forks: 57

# go.yaml.in/yaml ## 简介 `yaml` 包使得 [Go](https://go.dev/) 程序能够轻松地编码 和解码 [YAML](https://yaml.org/) 值。 它最初由 [Canonical](https://www.canonical.com) 开发,作为 [juju](https://juju.ubuntu.com) 项目的一部分,并且基于著名的 [libyaml](http://pyyaml.org/wiki/LibYAML) C 库的纯 Go 移植版,以 快速且可靠地解析和生成 YAML 数据。 ## 项目状态 本项目最初是极受欢迎的 [go-yaml]( https://github.com/go-yaml/yaml/) 项目的分支(fork),目前由官方的 [YAML 组织]( https://github.com/yaml/) 维护。 在 2025 年 4 月,go-yaml 的作者 @niemeyer 决定 [将项目仓库标记为“无人维护”]( https://github.com/go-yaml/yaml/blob/944c86a7d2/README.md) 后,经过与他讨论, YAML 团队接管了本项目的持续维护和开发工作。 我们组建了一支专注的维护团队,其中包括 go-yaml 最重要的下游项目的代表。 我们将努力赢得各个 go-yaml 分支的信任,使其重新切换回 此仓库作为其上游。 如果您想做出贡献或参与其中,请 [联系我们](https://cloud-native.slack.com/archives/C08PPAT8PS7)。 ### 版本规划 版本 `v1`、`v2` 和 `v3` 将保持为**冻结的历史版本**。 它们将**仅接收安全修复**,以便现有用户能够 在不受破坏性变更影响的情况下继续正常工作。 所有正在进行的工作,包括新功能和常规错误修复,都将在 **`v4`** 中进行。 如果您正在启动一个新项目或升级现有项目,请使用 `go.yaml.in/yaml/v4` 导入路径。 ## 兼容性 `yaml` 包支持 YAML 1.2 的大部分功能,但为了向后兼容, 保留了部分 1.1 的行为。 具体而言,`yaml` 包的 v3 版本: * 只要被解码为类型化的 bool 值,就支持 YAML 1.1 的布尔值(`yes`/`no`、`on`/`off`)。 否则,它们将被视为字符串。 YAML 1.2 中的布尔值仅限 `true`/`false`。 * 支持按照 YAML 1.1 标准以 `0777` 格式编码和解码八进制数, 而不是 YAML 1.2 中规定的 `0o777`,因为大多数解析器仍在使用旧格式。 不过,同时也支持 `0o777` 格式的八进制数,因此新文件也能正常工作。 * 不支持 base-60 浮点数。 这在 YAML 1.2 中已被取消,而且实际上本包 从未支持过,因为这显然是一个糟糕的设计。 ## 安装与使用 该包的导入路径为 *go.yaml.in/yaml/v4*。 要安装它,请运行: ``` go get go.yaml.in/yaml/v4 ``` ## API 文档 参见: ## API 稳定性 yaml v3 的包 API 将保持稳定,如 [gopkg.in]( https://gopkg.in) 中所述。 ## 示例 ``` package main import ( "fmt" "log" "go.yaml.in/yaml/v4" ) var data = ` a: Easy! b: c: 2 d: [3, 4] ` // Note: struct fields must be public in order for unmarshal to // correctly populate the data. type T struct { A string B struct { RenamedC int `yaml:"c"` D []int `yaml:",flow"` } } func main() { t := T{} err := yaml.Unmarshal([]byte(data), &t) if err != nil { log.Fatalf("error: %v", err) } fmt.Printf("--- t:\n%v\n\n", t) d, err := yaml.Marshal(&t) if err != nil { log.Fatalf("error: %v", err) } fmt.Printf("--- t dump:\n%s\n\n", string(d)) m := make(map[any]any) err = yaml.Unmarshal([]byte(data), &m) if err != nil { log.Fatalf("error: %v", err) } fmt.Printf("--- m:\n%v\n\n", m) d, err = yaml.Marshal(&m) if err != nil { log.Fatalf("error: %v", err) } fmt.Printf("--- m dump:\n%s\n\n", string(d)) } ``` 此示例将生成以下输出: ``` --- t: {Easy! {2 [3 4]}} --- t dump: a: Easy! b: c: 2 d: [3, 4] --- m: map[a:Easy! b:map[c:2 d:[3 4]]] --- m dump: a: Easy! b: c: 2 d: - 3 - 4 ``` ## 使用 `make` 进行开发和测试 一些 `make` 命令如下: * `make test` * `make lint tidy` * `make test-shell` * `make test v=1` * `make test o='-foo --bar=baz'` # 添加额外的 CLI 选项 * `make test GO-VERSION=1.2.34` * `make test GO_YAML_PATH=/usr/local/go/bin` * `make shell` # 启动带有本地 `go` 环境的 shell * `make shell GO-VERSION=1.2.34` * `make distclean` # 删除所有生成的文件,包括 `.cache/` ### 依赖自动安装 默认情况下,此 makefile 不会使用您系统的 Go 安装或 其需要的任何其他系统工具。 它所依赖的系统组件仅有: * Linux 或 macOS * GNU `make` (3.81+) * `git` * `bash` * `curl` 其他所有内容,包括 Go 和 Go 工具,都会在 makefile 需要时被安装并缓存(在 `.cache/` 目录下)。 ### 使用您自己的 Go 如果您想使用自己的 Go 安装和工具,请将 `GO_YAML_PATH` 导出为 包含 `go` 二进制文件的目录。 请使用类似以下的命令: ``` export GO_YAML_PATH=$(dirname "$(command -v go)") make # 或: make GO_YAML_PATH=$(dirname "$(command -v go)") ``` ## `go-yaml` CLI 工具 本仓库包含一个 `go-yaml` CLI 工具,可用于了解 使用 go-yaml 库进行 YAML 处理的内部阶段和最终结果。 我们强烈建议您在报告和讨论问题时, 提供该命令的相关输出。 ``` make go-yaml ./go-yaml --help ./go-yaml <<< ' foo: &a1 bar *a1: baz ' -n # Show value on decoded Node structs (formatted in YAML) ``` 您也可以使用以下命令安装它: ``` go install go.yaml.in/yaml/v4/cmd/go-yaml@latest ``` ## 许可证 yaml 包采用 MIT 和 Apache License 2.0 双重许可。 详情请参阅 LICENSE 文件。
标签:EVTX分析, Go, Ruby工具, SOC Prime, YAML, 反序列化, 安全库, 序列化, 开发工具, 日志审计, 解析库