我正在尝试使用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
)。
func (s *Section) mapTo(val reflect.Value, isStrict bool) error {
(我还尝试了使用较旧的go-ini,以防万一这是最近出现的错误)
答案 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)
...