我有一个配置文件,如下所示:

{
    "auth": {
        "client_id": "foo",
        "client_secret": "bar",
        "account": "foo@bar.com",
        "secrets_type": "auto"
    },
    "jobs": [
    {
        "source_folder": "folder1",
        "create_albums": "off",
        "delete_after_upload": false,
        "include": [
            "*.jpg"
        ],
        "exclude": []
    },
    {
        "source_folder": "folder2",
        "create_albums": "folderName",
        "delete_after_upload": true,
        "include": [
            "*.jpg", "*.webp"
        ],
        "exclude": [
            "abc*"
        ]
    }   
    ]
}

我正在用golang 的viper套餐阅读它.

我在获取jobs个设置时遇到了问题:

    type FolderUpload struct {
        sourceFolder      string   `mapstructure:"source_folder"`
        createAlbums      string   `mapstructure:"create_albums"`
        deleteAfterUpload bool     `mapstructure:"delete_after_upload"`
        include           []string `mapstructure:"include"`
        exclude           []string `mapstructure:"exclude"`
    }

    // Read the "jobsSettings" section as a slice of maps
    jobsSettings := viper.Get("jobs").([]interface{})

    // Iterate over each job item
    for _, job := range jobsSettings {
        jobMap := job.(map[string]interface{})

        j := FolderUploadJob{
            sourceFolder:      jobMap["source_folder"].(string),
            createAlbums:      jobMap["create_albums"].(string),
            deleteAfterUpload: jobMap["delete_after_upload"].(bool),
            include:           jobMap["include"].([]string),
            exclude:           jobMap["exclude"].([]string),
        }
    }

我也试过viper.UnmarshalKey(),但当我试图读取includeexclude时,我总是收到panic .

谁能给我指一条正确的路?

推荐答案

viper.UnmarshalKey的作品,请注意,FolderUpload的字段应该被导出.请看下面的演示:

package main

import (
    "fmt"
    "strings"

    "github.com/spf13/viper"
)

func main() {
    viper.SetConfigType("json")

    jsonConfig := `
{
    "jobs": [
    {
        "source_folder": "folder1",
        "create_albums": "off",
        "delete_after_upload": false,
        "include": [
            "*.jpg"
        ],
        "exclude": []
    },
    {
        "source_folder": "folder2",
        "create_albums": "folderName",
        "delete_after_upload": true,
        "include": [
            "*.jpg", "*.webp"
        ],
        "exclude": [
            "abc*"
        ]
    }
    ]
}`

    type FolderUpload struct {
        SourceFolder      string   `mapstructure:"source_folder"`
        CreateAlbums      string   `mapstructure:"create_albums"`
        DeleteAfterUpload bool     `mapstructure:"delete_after_upload"`
        Include           []string `mapstructure:"include"`
        Exclude           []string `mapstructure:"exclude"`
    }

    if err := viper.ReadConfig(strings.NewReader(jsonConfig)); err != nil {
        panic(err)
    }
    var jobs []FolderUpload

    if err := viper.UnmarshalKey("jobs", &jobs); err != nil {
        panic(err)
    }

    fmt.Printf("%+v\n", jobs)
}

Go相关问答推荐

区分Terminal和Hook Zerolog Go中的错误级别日志(log)输出

为什么(编码器).EncodeElement忽略";,innerxml";标记?

Go 中的sync.Cond 与 Wait 方法

在 GoLang 中对自定义 struct 体数组进行排序

Golang text/template中的startswith函数 - 入门教程

如何在 Go 中将 int 转换为包含 complex128 的泛型类型?

替换字符串中的最后一个字符

assert: mock: I don't know what to return because the method call was unexpected 在 Go 中编写单元测试时出错

当函数返回一个函数时,为什么 Go 泛型会失败?

Wire google Inject with multi return from provider 函数

接受通道和切片的通用函数

go-libp2p - 从流中接收字节

为什么 reflect.TypeOf(new(Encoder)).Elem() != reflect.TypeOf(interfaceVariable)?

如何使用 Go 获取 X11 中的窗口列表

每次有人进入我的网站时如何运行特定功能?

go 堆栈跟踪:在某些函数调用参数或返回值之后的问题(?)标记是什么意思?

gqlgen go,通过添加一个解析器来减少数据库调用

即使没有竞争条件也没有得到任何输出

如何访问Go 1.18泛型 struct (structs)中的共享字段

全局记录(across packages)