【Go语言实现并发安全map】

Go语言实现并发安全map

实现思路

  1. 使用sync.RWMutex实现读写锁分离,读操作不阻塞其他读操作
  2. 提供基本操作:Set/Get/Delete/Len/Keys等常用方法
  3. 所有方法都正确处理了锁的获取和释放
  4. 使用defer确保锁一定会被释放
  5. 线程安全的迭代器实现(Keys方法)
  6. 简单清晰的API设计,符合Go语言习惯

实现代码

go 复制代码
package main

import (
	"sync"
)

// SafeMap 并发安全的map结构
type SafeMap struct {
	mu   sync.RWMutex
	data map[string]interface{}
}

// NewSafeMap 创建新的SafeMap实例
func NewSafeMap() *SafeMap {
	return &SafeMap{
		data: make(map[string]interface{}),
	}
}

// Set 设置键值对
func (m *SafeMap) Set(key string, value interface{}) {
	m.mu.Lock()
	defer m.mu.Unlock()
	m.data[key] = value
}

// Get 获取键值
func (m *SafeMap) Get(key string) (interface{}, bool) {
	m.mu.RLock()
	defer m.mu.RUnlock()
	val, ok := m.data[key]
	return val, ok
}

// Delete 删除键
func (m *SafeMap) Delete(key string) {
	m.mu.Lock()
	defer m.mu.Unlock()
	delete(m.data, key)
}

// Len 获取map长度
func (m *SafeMap) Len() int {
	m.mu.RLock()
	defer m.mu.RUnlock()
	return len(m.data)
}

// Keys 获取所有键
func (m *SafeMap) Keys() []string {
	m.mu.RLock()
	defer m.mu.RUnlock()
	keys := make([]string, 0, len(m.data))
	for k := range m.data {
		keys = append(keys, k)
	}
	return keys
}

func main() {
	// 使用示例
	safeMap := NewSafeMap()
	safeMap.Set("name", "Jason")
	safeMap.Set("age", 18)
}