ZBLOG

如下 golang 代码 扫描的时候报错 return copies lock value: sync.Map contains sync.Mutex ,如何解决 unc Keys(pattern string) (sync.Map, error) { var res sync.Map fn := func(ctx context.Context, client *redis.Client) error { var cursor uint64 = 0 var count in...

这个错误是因为在 sync.Map 中存储了一个 sync.Mutex 的值。sync.Map 是 Go 语言提供的一种线程安全的字典类型,但它不支持直接存储带有锁的值。

解决这个问题的方法是将 value 替换为可以被并发访问的类型,例如使用指针或原子类型来包装需要保护的值。下面是一个修改后的代码示例:

type safeValue struct {
	value string
	mu    sync.Mutex
}

func (sv *safeValue) GetValue() string {
	sv.mu.Lock()
	defer sv.mu.Unlock()
	return sv.value
}

func (sv *safeValue) SetValue(newValue string) {
	sv.mu.Lock()
	defer sv.mu.Unlock()
	sv.value = newValue
}

func UncKeys(pattern string) (*sync.Map, error) {
	res := &sync.Map{}
	fn := func(ctx context.Context, client *redis.Client) error {
		var cursor uint64 = 0
		var count int64 = 1000

		for {
			keys, cursorNew, err := client.Scan(ctx, cursor, pattern, count).Result()
			if err != nil {
				return VerboseError(err, pattern, count)
			}
			for _, key := range keys {
				value, err := client.Get(ctx, key).Result()
				if err != nil {
					return VerboseError(err, pattern, count)
				}
				safeValue := &safeValue{value: value}
				res.Store(key, safeValue)
			}
			cursor = cursorNew
			if cursor == 0 {
				break
			}
		}
		return nil
	}

	return res, nil
}

在这个示例中,我们创建了一个 safeValue 结构体来包装需要保护的值,并使用互斥锁来控制对该值的并发访问。注意,在存储时我们存储的是指向 safeValue 的指针。

请记得在其他地方访问和修改这些值时,通过 GetValue()SetValue() 方法来获取和设置值,以确保线程安全。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=14630

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?