亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 golang 中持久化嵌套結構

在 golang 中持久化嵌套結構

Go
至尊寶的傳說 2023-05-08 15:01:40
我想添加持久性并從 json 初始化。我正在嘗試保存/加載嵌套結構并收到“致命錯誤:堆棧溢出”。據我了解,原因是父結構和子結構都有指向彼此的指針,并且 json 庫正在進入循環。我需要指向 Parent 的指針,因為需要從孩子那里訪問它。我知道這是一個常見問題,解決它的最佳方法是什么?type Mcloud struct {    Projects map[string]*Project `json:"Projects"`    Workdir  string}type Project struct {    Name     string    Networks map[string]Network    Parent   *Mcloud    TFC      TFConf}func newMcloud() *Mcloud {    mc := &Mcloud{        Projects: make(map[string]*Project),        Workdir:  defaultWorkDir,    }    mc.load(statefile)    return mc}func (mc *Mcloud) addProject(n string) {    mc.Projects[n] = &Project{        Name:     n,        Networks: make(map[string]Network),        Parent:   mc,    }    mc.Projects[n].addTFConf()}//save saves state to statefilefunc (mc *Mcloud) save(f string) (err error) {    if jsonState, err := json.Marshal(mc); err != nil {        fmt.Println("Was not able to marshal")        log.Fatal(err)    } else {        if err := ioutil.WriteFile(f, jsonState, 0666); err != nil {            fmt.Println("Was not able to write state to", f, "!")            log.Fatal(err)        }        fmt.Println("Save function saves: \n", mc, "to file ", f)    }    return err}func (mc *Mcloud) load(f string) (err error) {    var bytestate []byte    if bytestate, err = ioutil.ReadFile(f); err == nil {        err = json.Unmarshal(bytestate, &mc)    }    return err}獲得運行時:goroutine 堆棧超過 1000000000 字節限制致命錯誤:堆棧溢出運行時堆棧:runtime.throw(0x149cdfe, 0xe) /usr/local/Cellar/go/1.11.1/libexec/src/runtime/panic.go:608 +0x72 runtime.newstack() /usr/local/Cellar/go /1.11.1/libexec/src/runtime/stack.go:1008 +0x729 runtime.morestack() /usr/local/Cellar/go/1.11.1/libexec/src/runtime/asm_amd64.s:429 +0x8f
查看完整描述

1 回答

?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

首先你需要告訴encoding/json跳過父字段,你可以用json:"-"標簽來做到這一點。

然后在解組過程中,在加載父項的所有子項后,循環遍歷子項并設置它們的父項,您可以通過實現接口將此作為解組過程的一部分json.Unmarshaler。

type Mcloud struct {

? ? Projects map[string]*Project `json:"Projects"`

? ? Workdir? string

}


type Project struct {

? ? Name? ? ?string

? ? Networks map[string]Network

? ? Parent? ?*Mcloud `json:"-"` // ignore on un/marshal

? ? TFC? ? ? TFConf

}


func (m *Mcloud) UnmarshalJSON(data []byte) error {

? ? type tmp Mcloud

? ? if err := json.Unmarshal(data, (*tmp)(m)); err != nil {

? ? ? ? return err

? ? }


? ? // set Parent of all projects

? ? for _, p := range m.Projects {

? ? ? ? p.Parent = m

? ? }

? ? return nil

}


查看完整回答
反對 回復 2023-05-08
  • 1 回答
  • 0 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號