gpt4 book ai didi

Go错误: gob: type sync. Mutex没有导出字段

转载 作者:IT王子 更新时间:2023-10-29 01:47:00 25 4
gpt4 key购买 nike

我遇到一个问题,如果它有导出的 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)
}

输出:

Error: gob: type sync.Mutex has no exported fields

最佳答案

Gob 编码

Everything seems to work if I make the mutex unexported (by not capitalizing it). I'm curious to understand why this is.

作为Cerise mentioned有一个open issue为此,但简而言之,如果您尝试对没有导出字段的结构(例如互斥体)进行编码,这通常是一个编程错误。

不过,有一些方法可以解决这个特定问题。

您可以将互斥锁设为私有(private)并将锁定/解锁包装在公共(public)函数中,而不是进入结构来操纵互斥锁。例如

func (d *Dog) SetName(name string) {
d.GobMux.Lock()
d.Name = name
d.GobMux.Unlock()
}

你也可以把类型包裹起来,把互斥量拉出来:

type Dog struct {
Name string
}

type DogWrapper struct {
Dog *Dog
GobMux sync.Mutex
}

如果您有许多小结构,这会相当麻烦,但对于数量较少的更复杂的结构,这可能没问题。

最后,解决这个问题的“正确”方法是编写自己的 GobEncode/Decode 例程。 stdlib 中有一些稀疏的示例,例如 time.GobEncode,但通常这看起来工作量很大。

通用互斥量

...and make sure that there's no other issue with gobbing an unexported sync.Mutex.

互斥锁与 Go 运行时的进程内内存和调度器紧密耦合。它们帮助 Go 运行时决定允许哪些 goroutines 读取或写入内存的特定部分,并决定何时可以调度这些 goroutines(即等待互斥锁解锁的 goroutine 在互斥锁解锁之前不会被调度) .

如果您使用 Gob 将数据结构复制到另一个进程,则与发送 gob 的进程相比,接收进程的运行时具有完全不同的内部状态,因此互斥锁无法在逻辑上传输。将互斥锁复制到另一个进程有点像在火星上使用地球 GPS 坐标。他们只是不匹配。

when I read back a Dog object from a gob, it looks like the mutex is unlocked regardless of the state of the mutex when it was saved to a gob. Is this behavior I can count on?

作为documentation for Mutex状态,“互斥体的零值是一个未锁定的互斥体。”所以是的,您可以依赖这种行为。

其他编码器

在我看来,尽管 gob 出现在标准库中,但它并没有受到太多关注,因为还有许多其他成熟的编码选项可用。如果 gob 不能满足您的需求,还有许多其他选项可供选择——JSON、Cap'n Proto、net/rpc 等具有不同特性的可能更适合您。

关于Go错误: gob: type sync. Mutex没有导出字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50595570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com