【问题标题】:How to write a Go function to accept different structs?如何编写一个 Go 函数来接受不同的结构?
【发布时间】:2015-09-01 09:12:43
【问题描述】:

我正在编写一个解析配置 JSON 文件并使用 json.Unmarshal 将其数据存储在结构中的函数。我做了一些研究,它让我明白了我有一个 Config 结构和一个 Server_Config 结构作为 config 中的一个字段,以允许我添加更多字段,因为我想要不同的类似配置的结构。

如何编写一个 parseJSON 函数来处理不同类型的结构?

代码:

Server.go

type Server_Config struct {
    html_templates string
}

type Config struct {
    Server_Config
}

func main() {
    config := Config{}
    ParseJSON("server_config.json", &config)
    fmt.Printf("%T\n", config.html_templates)
    fmt.Printf(config.html_templates)
}

config.go

package main
import(
    "encoding/json"
    "io/ioutil"
    "log"
)

func ParseJSON(file string, config Config) {
    configFile, err := ioutil.ReadFile(file)
    if err != nil {
        log.Fatal(err)
    }
    err = json.Unmarshal(configFile, &config)
    if err != nil {
        log.Fatal(err)
    }
}

或者,如果有更好的方法来完成这一切,请告诉我。对 Go 来说还很陌生,我的大脑中刻有 Java 约定。

【问题讨论】:

    标签: json struct go


    【解决方案1】:

    使用interface{}:

    func ParseJSON(file string, val interface{}) {
        configFile, err := ioutil.ReadFile(file)
        if err != nil {
            log.Fatal(err)
        }
        err = json.Unmarshal(configFile, val)
        if err != nil {
            log.Fatal(err)
        }
    }
    

    调用函数也是一样的

    【讨论】:

    • interface{} 是最接近 Go 中泛型类型的东西,你可以使用它传递任何类型,json 然后使用 reflect 来处理它。
    猜你喜欢
    • 2016-12-12
    • 2016-07-07
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2019-09-26
    • 2011-02-24
    • 2016-03-28
    • 1970-01-01
    相关资源
    最近更新 更多