ZBLOG

golang 并发更新[]string

在 Go 中,slice 类型也是可以通过并发进行更新的。不过需要注意的是,在多个 goroutine 同时对一个 slice 进行修改时,会出现竞态条件(race condition)和数据不一致等问题。

为了保证 slice 的并发安全,可以使用 sync.Mutex 或者 sync.RWMutex 来实现互斥访问。下面是一个使用 sync.Mutex 实现并发更新 []string 的示例代码:

package main

import (
	"fmt"
	"sync"
)

type Data struct {
	mu    sync.Mutex
	items []string
}

func (d *Data) Append(item string) {
	d.mu.Lock()
	defer d.mu.Unlock()
	d.items = append(d.items, item)
}

func main() {
	var wg sync.WaitGroup

	data := &Data{items: make([]string, 0)}

	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(i int) {
			item := fmt.Sprintf("item%d", i)
			data.Append(item)
			fmt.Printf("goroutine %d appended item: %s\n", i, item)
			wg.Done()
		}(i)
	}

	wg.Wait()

	fmt.Printf("final data items are: %v\n", data.items)
}

在上面的示例代码中,我们定义了一个包含互斥锁和字符串切片的结构体 Data。结构体方法 Append 使用互斥锁保护了对字符串切片的追加操作。然后我们启动了 10 个 goroutine 并发地调用 Append 方法,并打印出每个 goroutine 追加的字符串值。最后输出最终的字符串切片。

需要注意的是,使用互斥锁会带来一定的性能开销,特别是在高并发场景下。如果只是简单地追加字符串元素到切片中,可以考虑使用 channel 或者 sync.Pool 等方式来代替 slice,并使用 sync.Mutex 进行保护。这样可以避免频繁地创建和销毁 slice 对象,并且可以更好地利用 CPU 缓存。

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?