我嘗試做的
我為Apps撰寫了一個模板,每個模板App都有一個配置 - 因此我想將其存盤Config到App struct.
我所有的configs 都存盤在JSON- 因此我想提供一個func加載JSON
const JSON = `{
"Name": "TestConfig"
}`
注意:我嘗試使用和不使用指標來解決我的問題,兩者都會導致相同的錯誤訊息 - 兩個版本都包含在下面。
因此,讓我們將 App-Template 視為:
type App struct {
config interface{}
configPtr *interface{}
}
和Configuration:
// ConfigurationA is an actual implementation of the Config (Application A)
type ConfigurationA struct {
Name string
// ... add more properties here
}
另外我實作一個func加載Config的file,并將其存盤在App
func (a *App) GeneralConfigLoader(jsonData string, v interface{}) (err error) {
// load json -> struct
err = json.Unmarshal([]byte(jsonData), &v)
if err != nil {
fmt.Println("error unmarshalling JSON data")
return err
}
a.config = v
a.configPtr = &v
return nil
}
因為我有一個具有一般負載的應用程式,func所以現在應該可以創建一個簡單的func將空介面轉換為正確的配置結構的方法。
// Config - Config of the App
func Config(a *App) *ConfigurationA {
var cfg ConfigurationA = a.config.(ConfigurationA)
return &cfg
}
// ConfigPtr - Config of the App
func ConfigPtr(a *App) *ConfigurationA {
var i interface{} = *a.configPtr
return i.(*ConfigurationA)
}
如果我將其總結為一個可執行檔案,例如:
func main() {
var conf ConfigurationA // the interface used as Configuration
var a = &App{}
a.GeneralConfigLoader(JSON, conf)
//panics: interface conversion: interface {} is map[string]interface {}, not main.ConfigurationA
var cfg = Config(a)
fmt.Println("cfg -> ", cfg)
//panics: interface conversion: interface {} is map[string]interface {}, not *main.ConfigurationA
var cfgPtr = ConfigPtr(a)
fmt.Println("cfgPtr -> ", cfgPtr)
}
應用程式崩潰(上面部分中的評論...)
為什么 go 會省略型別資訊?
或者更好......為什么我不能將配置轉換回原來的樣子,因為我知道它是什么......?
注意
如果我不使用這個通用加載器并創建具體的實作,它確實有效!
問題:
我究竟做錯了什么?
使用 go ( 懷疑是) 根本不可能嗎?
uj5u.com熱心網友回復:
將指標傳遞給 GeneralConfigLoader。解組到該指標。丟棄欄位App.configPtr。它沒有用,也沒有達到您的預期。
func (a *App) GeneralConfigLoader(jsonData string, v interface{}) (err error) {
err = json.Unmarshal([]byte(jsonData), v) // & removed here
if err != nil {
fmt.Println("error unmarshalling JSON data")
return err
}
a.config = v
return nil
}
func Config(a *App) *ConfigurationA {
return a.config.(*ConfigurationA)
}
像這樣加載配置:
var config ConfigurationA
var a = &App{}
a.GeneralConfigLoader(JSON, &config) // & added here
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/353827.html
上一篇:Go無法將func識別為有效介面
