gpt4 book ai didi

go - 为什么 Go 生成的 protobuf 文件包含互斥锁?

转载 作者:行者123 更新时间:2023-12-02 11:23:29 24 4
gpt4 key购买 nike

在 go 中工作和生成 protobuf stub 时,我偶然发现了这个有趣的问题。
每当我尝试按值复制消息的结构时,我都会收到以下警告:

call of state.world.script.HandleEvent copies lock value: throne/server/messages.PlayerDialogeStatus contains google.golang.org/protobuf/internal/impl.MessageState contains sync.Mutex copylocks


我明白为什么按值复制互斥锁是错误的 ,我开始想知道为什么他们一开始就在那里。
因此我的问题是:为什么 go 生成的 protobuf 文件包含放置在消息结构上的互斥锁,特别是在 MessageState 上结构?
或者: MessageState 中的互斥锁的目标是什么?在生成的 protobuf 消息结构上找到结构?

最佳答案

impl.MessageState仅嵌入在具体消息中,而不是嵌入在实现原始消息的生成结构中。
它专门嵌入了三个pragmas : NoUnkeyedLiterals , DoNotCompare , 和 DoNotCopy .
最后一个,DoNotCopysync.Mutex 的零大小数组.唯一的目的是拥有 go vet如评论中所述,大声提示浅拷贝:

DoNotCopy can be embedded in a struct to help prevent shallow copies.This does not rely on a Go language feature, but rather a special casewithin the vet checker.


总结: impl.MessageState不应该被复制,互斥锁只是为了捕捉复制 .如果你这样做,那是因为你使用了错误的方法。

关于go - 为什么 Go 生成的 protobuf 文件包含互斥锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64183794/

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