Go语言切片原生支持并发吗?

  发布时间:2025-11-05 15:49:14   作者:玩站小弟   我要评论
实践检验真理实践是检验真理的唯一标准,所以当我们遇到一个不确定的问题,直接写demo来验证,因为切片的特点,我们可以分多种情况来验证:不指定索引,动态扩容并发向切片添加数据。func concurre 。
实践检验真理

实践是语言原生检验真理的唯一标准,所以当我们遇到一个不确定的切片问题,直接写demo来验证,支持因为切片的语言原生特点,我们可以分多种情况来验证:

不指定索引,切片动态扩容并发向切片添加数据。支持func concurrentAppendSliceNotForceIndex() {

Go语言切片原生支持并发吗?

sl := make([]int,语言原生 0)

wg := sync.WaitGroup{}

for index := 0; index < 100; index++{

k := index

wg.Add(1)

go func(num int) {

sl = append(sl, num)

wg.Done()

}(k)

}

wg.Wait()

fmt.Printf("final len(sl)=%d cap(sl)=%d\n", len(sl), cap(sl))

}

通过打印数据发现每次的结果都不一致,先不急出结论,切片我们在写其他的支持demo测试一下:

指定索引,指定容量并发向切片添加数据。语言原生func concurrentAppendSliceForceIndex() {

sl := make([]int,切片 100)

wg := sync.WaitGroup{}

for index := 0; index < 100; index++{

k := index

wg.Add(1)

go func(num int) {

sl[num] = num

wg.Done()

}(k)

}

wg.Wait()

fmt.Printf("final len(sl)=%d cap(sl)=%d\n", len(sl), cap(sl))

}

通过结果我们可以发现符合我们的预期,长度和容量都是支持100,所以说slice支持并发吗?语言原生

slice支持并发吗?

我们都知道切片是对数组的抽象,其底层就是切片数组,站群服务器在并发下写数据到相同的支持索引位会被覆盖,并且切片也有自动扩容的功能,当切片要进行扩容时,就要替换底层的数组,在切换底层数组时,多个goroutine是同时运行的,哪个goroutine先运行是不确定的,不论哪个goroutine先写入内存,肯定就有一次写入会覆盖之前的写入,所以在动态扩容时并发写入数组是不安全的;

所以当别人问你slice支持并发时,你就可以这样回答它:

当指定索引使用切片时,切片是支持并发读写索引区的数据的云服务器提供商,但是索引区的数据在并发时会被覆盖的;当不指定索引切片时,并且切片动态扩容时,并发场景下扩容会被覆盖,所以切片是不支持并发的~。

github上著名的iris框架也曾遇到过切片动态扩容导致webscoket连接数减少的bug,最终采用sync.map解决了该问题。

总结

针对上述问题,我们可以多种方法来解决切片并发安全的问题:

加互斥锁使用channel串行化操作使用sync.map代替切片

切片的问题还是比较容易解决,针对不同的场景可以选择不同的方案进行优化,你学会了吗?

  • Tag:

相关文章

  • 金立FL00手机评测(性能强劲,拍照出众,金立FL00手机值得购买)

    摘要:作为一款备受关注的新机型,金立FL00手机在市场上引起了广泛的关注。它以其强大的性能和出色的拍照功能吸引了不少消费者的眼球。本文将对金立FL00手机进行全面的评测,从外观设计、性能...
    2025-11-05
  • 一篇带给你Go语言的并发

    并发前言在学习 Go 的并发之前,先复习一下操作系统的基础知识。并发与并行先来理一理并发与并行的区别。并行:指的是在同一时间,多个程序在不同的 CPU 上共同运行,互相之间并没有对 CPU 资源进行竞
    2025-11-05
  • 如何动态导入ECMAScript模块?

    ECMAScript(又名ES2015或ES)模块是在JavaScript中组织内聚代码块的一种方法。ES模块系统有2个部分:import模块 - 使用 import { func } from ./
    2025-11-05
  • Vue 2 系统如何快速迁移 Vite 作为开发工具

    当前版本 vite@2.3.7一. 适合什么项目迁移使用 vue2 的系统 内部系统 - 无需大型流量场景:因为 vite 更迭较快,导致系统需要定期改动基础功能,造成不稳定
    2025-11-05
  • 军工三防手机(从看军工三防手机的先进技术和可靠性能)

    摘要:随着现代社会的发展,手机已经成为人们生活中必不可少的工具。然而,在极端环境下使用手机往往面临着严峻的挑战,而军工三防手机的问世,为用户提供了一种高强度、高耐用的选择。本文将从关键字...
    2025-11-05
  • Python 时间序列预测:Hot-winters

    Python中文社区(ID:python-china)1. 什么是Holt-Winters时间序列是非常常见的数据格式,以[时间,观测值]形式表现,如下图。现实场景中如股票走势图,国家GDP历年数据,
    2025-11-05

最新评论