这个错误是因为在 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助手提供,问题来源于学员提问




