【问题标题】:What is the right way to use go-ini's mapTo function?使用 go-ini 的 mapTo 函数的正确方法是什么?
【发布时间】:2019-12-03 20:29:16
【问题描述】:

背景

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

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

这发生在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,以防它是最近的错误)

【问题讨论】:

    标签: pointers go reflection


    【解决方案1】:

    var c *Config 为您提供 *Config 类型的 nil 指针,这会导致取消引用恐慌。

    改为

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

    【讨论】:

    • 不幸的是,这导致signal SIGSEGV: segmentation violation code=0x1
    猜你喜欢
    • 2019-03-31
    • 2023-01-31
    • 1970-01-01
    • 2021-01-26
    • 2010-11-10
    • 1970-01-01
    • 2019-05-07
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多