猿问

在 Go 中的 json.Marshal 期间锁定对象

当它被编组到 json 时,我想将 RLock/RUnlock 添加到结构中。

下面的示例显示了我尝试做的事情。但是,它不起作用,因为json.Marshal调用了every ,它将运行该Object.MarshalJSON方法,该方法本身调用 json.Marshal,从而导致无限循环。


例子:


package main


import (

    "fmt"

    "encoding/json"

    "sync"

)


type Object struct {

    Name string

    Value int


    sync.RWMutex

}


func (o *Object) MarshalJSON() ([]byte, error) {

    o.RLock()

    defer o.RUnlock()


    fmt.Println("Marshalling object")


    return json.Marshal(o)

}


func main() {

    o := &Object{Name: "ANisus", Value: 42}


    j, err := json.Marshal(o)

    if err != nil {

        panic(err)

    }

    fmt.Printf("%s\n", j)

}

输出:

编组对象
编组对象
编组对象
...

显然,我可以在调用 json.Marshal 之前删除 MarshalJSON 方法并在主函数中调用 Lock()。但是,我的问题是:

有没有办法在结构的 MarshalJSON 方法中调用 json.Marshal (或至少让 json 包处理编码)?

奖金问题
为什么我的程序没有冻结?第二次递归调用 MarshalJSON 时,不应该锁定结构吗?


蝴蝶不菲
浏览 229回答 2
2回答
随时随地看视频慕课网APP

相关分类

Go
我要回答