我想在将结构编组为 json 时将 RLock/RUnlock 添加到结构中。
下面的示例显示了我尝试做的事情。但是,它不起作用,因为everyjson.Marshal
被调用,它将运行该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)
}
输出:
编组对象
编组对象
编组对象
...
显然,我可以删除 MarshalJSON 方法并在 main 函数中调用 Lock(),然后再调用 json.Marshal。但是,我的问题是:
有没有办法在结构的 MarshalJSON 方法中调用 json.Marshal (或者至少让 json 包处理编码)?
奖金问题
为什么我的程序没有冻结?第二次递归调用 MarshalJSON 时,不应该锁定结构吗?