我在Go语言中有一个带互斥锁的结构体:
package main
import (
"fmt"
"sync"
)
type foo struct {
sync.Mutex
lastID uint64
nameToID map[string]uint64
}
func main() {
fmt.Println("Hello, playground")
foo2 := foo{lastID: 0,nameToID: map[string]uint64{"name":0}}
fmt.Println(foo2)
}
上面给出了一个go vet警告(https://play.golang.org/p/J0NFgBvSGJC):
./prog.go:17:14: call of fmt.Println copies lock value: play.foo
我看到了一个相关的github问题https://github.com/golang/go/issues/13675,并且理解了这个警告在复制锁时的必要性。我可以通过创建一个自定义的字符串方法来解决上述问题。然而,由于带互斥锁的结构体似乎很普遍,我想知道在Go语言中是否有更好的/惯用的方法来记录包含互斥锁的结构体?
1条答案
按热度按时间kx5bkwkv1#
你不应该通过传值传递 foo2,因为你会复制互斥锁。互斥锁只有在作为指针共享时才有意义。因此,整个结构都作为指针传递。
或扩展格式