【发布时间】: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)。
func (s *Section) mapTo(val reflect.Value, isStrict bool) error {
它需要什么作为输入,如果失败,apcore 框架为什么会这样使用它?
(我也尝试过使用较旧的 go-ini,以防它是最近的错误)
【问题讨论】:
标签: pointers go reflection