Go 语言的 yaml 库 <github.com/go-yaml/yaml> 的默认 map 类型是 map[any]any,而不是 map[string]any

V2 代码:https://github.com/go-yaml/yaml/blob/v2/decode.go#L241 V3 代码:https://github.com/go-yaml/yaml/blob/v3/decode.go#L334

因此,当使用这个库对 yaml 内容进行 unmarshal 的时候,由 go-yaml 自动创建的 map 的类型是 map[any]any

package main

import (
	"fmt"
	"log"

	"gopkg.in/yaml.v2"
)

var content = `
storage:
  settings:
    fs:
      ad:
        username: admin
      ldap:
        password: password

`

type Storage struct {
	Settings map[string]any `yaml:"settings"`
}

type Config struct {
	Storage *Storage `yaml:"storage"`
}

func main() {
	c := new(Config)
	err := yaml.Unmarshal([]byte(content), c)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("%T\n", c.Storage.Settings["fs"])
}

上面代码的输出是:

❯ go run testcmd.go
map[interface {}]interface {}

知识共享许可协议本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。