使用go-ini的mapTo函数的正确方法是什么?

时间:2019-07-25 14:11:16

标签: pointers go reflection

背景

我正在尝试使用go-fed的apcore框架来构建联合应用程序。我已经实现了apcore.Application接口,但是在加载配置过程中遇到了麻烦。

尝试将从panic: reflect: call of reflect.Value.Type on zero Value加载的配置映射到config.ini配置结构时,服务器以apcore响应。

here

func loadConfigFile(filename string, a Application, debug bool) (c *config, err error) {
    InfoLogger.Infof("Loading config file: %s", filename)
    var cfg *ini.File
    cfg, err = ini.Load(filename)
    if err != nil {
        return
    }
    err = cfg.MapTo(c)
    if err != nil {
        return
    }
.
.
.

它显然只使用未初始化的*config指针。这使我相信,这与我尚未编写的代码(Application的实现)无关。

问题

我决定编写一个非常简单的MapTo用例,以检查它是否按我预期的那样工作:

package main

import (
    "fmt"
    "gopkg.in/ini.v1"
)

type Config struct {
    Name      string `ini:"NAME"`
    Male      bool
    Age       int `comment:"Author's age"`
    GPA       float64
}

func main() {
    var cfg *ini.File
    var err error
    cfg, err = ini.Load("config.ini")
    var c *Config
    // c := &Config{ Name: "test", Male: true, Age: 13, GPA: 4.5 }
    // c := new(Config)
    fmt.Println(c);
    err = cfg.MapTo(c)
    fmt.Println(err.Error())
}

这还将返回panic: reflect: call of reflect.Value.Type on zero Value。既不传递Config文字,也不传递cannot map to non-pointer struct,也没有初始化指针(signal SIGSEGV: segmentation violation)。

这是function declaration

func (s *Section) mapTo(val reflect.Value, isStrict bool) error {

作为输入需要什么?如果失败,apcore框架为什么会以这种方式使用它?

(我还尝试了使用较旧的go-ini,以防万一这是最近出现的错误)

1 个答案:

答案 0 :(得分:0)

var c *Config为您提供了*Config类型的nil指针,这会导致解除恐慌。

改为

var foo Config
c := &foo //which give you a non-nil pointer to zero struct
err = cfg.MapTo(c)
...