【发布时间】:2023-03-10 09:04:01
【问题描述】:
我遇到的问题是,如果结构具有导出的 sync.Mutex,我无法将其保存为 gob。如果我使互斥锁未导出(通过不将其大写),一切似乎都有效。我很想知道为什么会这样,并确保吞下未导出的 sync.Mutex 没有其他问题。
我看到在 Google 上有多次点击与 sync.RWMutex 相关的问题,但没有人真正解释为什么会发生这种情况。
package main
import (
"sync"
"encoding/gob"
"os"
"fmt"
)
func writeGob(filePath string, object interface{}) error {
file, err := os.Create(filePath)
defer file.Close()
if err != nil {
return err
}
encoder := gob.NewEncoder(file)
err = encoder.Encode(object)
return err
}
type Dog struct {
Name string
GobMux sync.Mutex
}
func main() {
d := &Dog{Name: "Fido"}
err := writeGob("./gob", d)
fmt.Printf("Error: %v\n", err)
}
输出:
错误:gob:类型 sync.Mutex 没有导出字段
【问题讨论】:
-
关于这个问题有一个未解决的问题:github.com/golang/go/issues/5819
-
明白了。一个后续问题:当我从 gob 读回 Dog 对象时,看起来互斥锁已解锁,而不管互斥锁在保存到 gob 时的状态如何。我可以指望这种行为吗?
-
您根本不应该指望反序列化的互斥锁。它在概念上是没有意义的——无论序列化的进程都不能被认为是反序列化它的同一个运行进程,所以互斥锁是没有意义的。它不应包含在序列化中。
-
@Adrian 那么这里的最佳做法是什么?我需要序列化一个包含互斥字段的对象,但看起来没有办法指定 gob 应该忽略一个字段:stackoverflow.com/questions/50595570/…