【发布时间】:2022-01-04 02:23:47
【问题描述】:
YAML 文件:
namespaces:
- namespace: default
aliasname: k8s
components:
- component: comp1
replicas: 1
port: 8080
- component: comp2
replicas: 1
port: 9999
- namespace: ns2
components:
- component: comp1
replicas: 1
从上面的 YAML 文件中,我想创建如下结构:
type Namespaces struct {
NamespaceName string `yaml:"namespace"`
Aliasname string `yaml:"aliasname,omitempty"`
ListOfComponents []Components `yaml:"components"`
ComponentMap map[string]Components
}
type Components struct {
ComponentName string `yaml:"component"`
NumReplicas int `yaml:"replicas"`
Port int `yaml:"port"`
}
type Config struct {
ListOfNamespaces []Namespaces `yaml:"namespaces"`
NamespaceMap map[string]Namespaces
}
当分别访问config 和namespace 对象时,应该能够检索到字段Namespacemap 和Componentmap。我创建了一个将命名空间和组件列表转换为映射的方法,但是当我调用config.Namespacemap 或Namespace.ComponentMap 时,它返回一个空映射。
基本上我想知道:我们如何为类型结构添加额外的字段?我想从config 结构访问新变量,例如地图。
更新: 感谢 blami 指导我,但是当我尝试为组件编写相同的内容时,它并没有给我包含组件映射的整个命名空间映射:
type Components struct {
ComponentName string `yaml:"component"`
NumReplicas int `yaml:"replicas"`
Port int `yaml:"port"`
}
type Namespaces struct {
NamespaceName string `yaml:"namespace"`
Aliasname string `yaml:"aliasname"`
ComponentMap map[string]Components `yaml:"components"`
}
func (n *Namespaces) UnmarshalYAML(unmarshal func(interface{}) error) error {
type origNamespace struct {
ListOfComponents []Components `yaml:"components"`
}
var on origNamespace
err1 := unmarshal(&on)
if err1 != nil {
return err1
}
n.ComponentMap = make(map[string]Components)
for _, i := range on.ListOfComponents {
n.ComponentMap[i.ComponentName] = i
}
return nil
}
当我运行 config.NamespaceMap 时,它会给出以下信息
map[:{NamespaceName: K8sNamespace: ComponentMap:map[comp1:{ComponentName:comp1 NumShards:0 NumReplicas:1 Port:0 EpochLength:0}]}]
【问题讨论】:
-
请考虑解决这个问题。 “我正在尝试将以下 yaml 解组为一个结构,该结构具有我可以与结构一起访问的额外字段映射?”对我来说看起来不像一个句子。
-
嗨,我已经编辑了问题,如果需要进一步编辑,请告诉我。
-
能否在问题中包含您引用的代码/方法
标签: go struct hashmap yaml unmarshalling