将配置结构加载到 go 中后,访问嵌套属性时出现问题



所以我想在我的程序中加载一个config.yaml文件到我的程序中。

defaultTimeout: 0.25
defaultWorkspace: ibm
workspaces:
ibm:
client: 47943938
defaultGoal: 27.5
projects:
- 159929907
- 160046030
- 160064503
pp:
defaultGoal: 5.5
project: 160064503

因此,我创建以下结构:

type Config struct {
DefaultTimeout   float64 `yaml:"defaultTimeout"`
DefaultWorkspace string  `yaml:"defaultWorkspace"`
Workspaces       struct {
IBM struct {
Client      int     `yaml:client`
DefaultGoal float64 `yaml:"defaultGoal"`
Projects    []int   `yaml:"projects"`
}
PP  struct {
DefaultGoal float64 `yaml:"defaultGoal"`
Project     int     `yaml:project`
}
}
}

所以基本上,我列出了不同的工作区,具有不同的属性和一个共同的属性:DefaultGoal。现在我想以干净有效的方式访问此属性。

现在,我有了参数*workspaceName,用于决定要选择哪个工作区。所以问题是我如何使用它作为我想选择的键,然后进一步获得相应条目DefaultGoalWorkspace

我尝试了以下内容(config是从yaml源加载的结构(

wsConf := reflect.Indirect(reflect.ValueOf(config.Workspaces)).FieldByName(*workspaceName)

但是我有reflect.Value,我必须重新转换为结构以评估DefaultGoal

有没有好方法可以在这里进行?任何帮助不胜感激!

与其使用反射(reflect包(,不如将map[string]interface{}用作字段类型(特别是Workspaces字段(,然后将此地图中的项目视为特定工作空间。

type Config struct {
DefaultTimeout   float64 `yaml:"defaultTimeout"`
DefaultWorkspace string  `yaml:"defaultWorkspace"`
Workspaces       map[string]interface{} `yaml: workspaces`
}
type IBM struct {
Client      int     `yaml:client`
DefaultGoal float64 `yaml:"defaultGoal"`
Projects    []int   `yaml:"projects"`
}
type PP struct {
DefaultGoal int `yaml:"defaultGoal"`
Project     int `yaml:project`
}
func main() {
var cfg Config
// init cfg somehow
for space, value := range cfg.Workspaces {
switch space {
case "ibm": // convert `value` to IBM struct
case "pp": // convert `value` to PP struct
}
}

如果要根据Workspace名称取消编组到特定的结构中,可以尝试此方法。(使用 json 时通常不需要额外的封送步骤。更多 这里(.这里的工作示例

package main
import (
"log"
"gopkg.in/yaml.v2"
)
type Config struct {
DefaultTimeout   float64 `yaml:"defaultTimeout"`
DefaultWorkspace string  `yaml:"defaultWorkspace"`
Workspaces       map[string]interface{}
}
type PP struct {
DefaultGoal int `yaml:"defaultGoal"`
Project     int `yaml:"project"`
}
type IBM struct {
Client      int     `yaml:"client"`
DefaultGoal float64 `yaml:"defaultGoal"`
Projects    []int   `yaml:"projects"`
}
func main() {
yamlData := `defaultTimeout: 0.25
defaultWorkspace: ibm
workspaces:
ibm:
client: 47943938
defaultGoal: 27.5
projects:
- 159929907
- 160046030
- 160064503
pp:
defaultGoal: 5.5
project: 160064503`
var c Config
if err := yaml.Unmarshal([]byte(yamlData), &c); err != nil {
panic(err)
}
for space, value := range c.Workspaces {
bs, err := yaml.Marshal(value)
if err != nil {
panic(err)
}
switch space {
case "ibm":
var i IBM
if err := yaml.Unmarshal(bs, &i); err != nil {
panic(err)
}
log.Printf("IBM value: %v", i)
case "pp":
var p PP
if err := yaml.Unmarshal(bs, &p); err != nil {
panic(err)
}
log.Printf("PP value: %v", p)
}
}
}

最新更新