Go语言 如何记录带有互斥锁的结构

n3schb8v  于 2023-01-22  发布在  Go
关注(0)|答案(1)|浏览(103)

我在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语言中是否有更好的/惯用的方法来记录包含互斥锁的结构体?

kx5bkwkv

kx5bkwkv1#

你不应该通过传值传递 foo2,因为你会复制互斥锁。互斥锁只有在作为指针共享时才有意义。因此,整个结构都作为指针传递。

fmt.Println(&foo2)

或扩展格式

fmt.Printf("%+v\n", &foo2)

相关问题