【踩了一个坑】为什么 golang struct 中的 slice 无法原子赋值
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
有这样一个结构体:
type MySt struct{
Field []byte
}
我在数组排序中想要交换值:
func Swap(arr []MySt, i,j int){
arr[i], arr[j] = arr[j], arr[i]
}
我猜测,就算其成员 Field 是引用类型,但是引用的指针也会交换,应该是没问题的。
实际测试这里复制错误了。
于是我换个写法:
func Swap(arr []MySt, i,j int){
arr[i].Field, arr[j].Field = arr[j].Field, arr[i].Field
}
上面的代码仍然是不行。
猜测是编译期产生的代码不是类似 memcpy() 这种,而是逐个成员去交换,交换到指针这里时,无法做到原子的交换,从而出了问题。
改成下面的方法,终于对了:
func Swap(arr []MySt, i,j int){
arr[i].Field, arr[j].Field = swapSlice(arr[j].Field, arr[i].Field)
}
func swapSlice(a, b []byte) ([]byte, []byte) {
return b, a
}
仍然无法理解我为社么错了,求指教。
【踩了一个坑】为什么 golang struct 中的 slice 无法原子赋值的更多相关文章
- 使用ffmpeg视频编码过程中踩的一个坑
今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,非常多时候一旦思维定势真的挺难突破的.以下是不对的编码结果: ...
- 【转】最近用Timer踩了一个坑,分享一下避免别人继续踩
[转]最近用Timer踩了一个坑,分享一下避免别人继续踩 最近做一个小项目,项目中有一个定时服务,需要向对方定时发送数据,时间间隔是1.5s,然后就想到了用C#的Timer类,我们知道Timer 确实 ...
- 记新人从 excel 文件中读取字典数据踩的一个坑
原本是打算今天分享一下最近学习接口自动化的心得体会,然而在我写模板的时候,却被一个坑拦我大半天,心得体会不得不 延期再分享了.在我无数次调试无数次看log,终于发现并解决这个问题了.下面记录一下踩的坑 ...
- Javascript之旅——第八站:说说instanceof踩了一个坑
前些天写js遇到了一个instanceof的坑,我们的页面中有一个iframe,我在index页面中计算得到了一个array,然后需要传递到Flight页面 这个嵌套的iframe中的一个函数(Sea ...
- toFixed()一不小心踩了一个坑
toFixed,多么简单的一个函数,昨天突发奇想做两道算法题练练手.结果,踩到了一个从未遇到的坑! \n 简单来讲是要对输入的很多组数据,自己写一个函数做个处理,把每次函数处理的结果要相加求和.最后输 ...
- 最近用Timer踩了一个坑,分享一下避免别人继续踩
最近做一个小项目,项目中有一个定时服务,需要向对方定时发送数据,时间间隔是1.5s,然后就想到了用C#的Timer类,我们知道Timer 确实非常好用,因为里面有非常人性化的start和stop功能, ...
- java 反射的踩的一个坑
今天工作的时候用到了一个反射.其业务简单描述为:系统启动时将需要定时调用的方法签名保存到数据库中,开启线程定时从数据库中读取对应的方法签名,通过反射生成实例后调用方法.完成一定的定时任务. 写到的方法 ...
- leaflet control.layers踩的一个坑
Control.Layers方法 该方法可以创建一个切换图层的工具, L.control.layers(baseLayers, overlayers).addTo(map); baseLayers参数 ...
- 使用SpringMVC<mvc:view-controller/>标签时踩的一个坑
<mvc:view-controller>标签 如果我们有些请求只是想跳转页面,不需要来后台处理什么逻辑,我们无法在Action中写一个空方法来跳转,直接在中配置一个如下的视图跳转控制器即 ...
- mongodb 的Cursor 作为 stream 的时候,读出来的数据数字开头的key没法访问(又踩了一个坑)
mongdb 用Cursor 读取数据的时候,直接用流读出来的数据key是数字开头的话,就是独具不到,用Object.keys() 把所有的key 打印出来的话如下:怎么会是这样的呢? 查看了一下文档 ...
随机推荐
- Redis现网那些坑:用个缓存,还要为磁盘故障买单?
摘要:向业务查询超时say goodbye! 本文分享自华为云社区<Redis现网那些坑:用个缓存,还要为磁盘故障买单?>,作者: GaussDB 数据库 . 近日,网上一些电商用户出现了 ...
- 云计算的三种模式IaaS/PaaS/SaaS/BaaS对比:SaaS架构设计分析
SaaS--软件即服务(Software as a Service)的出现改变了传统使用软件转变为使用服务. SaaS与传统软件的最大区别是,前者按年付费租用服务,后者一次买断.这貌似只是" ...
- python 正则表达式简单使用
定义: 正则表达式,又称规则表达式,通常被用来检索.替换那些符合某个模式(规则)的文本. 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个&quo ...
- 在Windows下配置Clang编译器
Preferences Linux & macOS 平台LLVM 相关工具链下载 2019年,在Windows下配置Clang编译器 Visual Studio 2022 中使用 Clang ...
- 【3rd_Party】Cpp 单元测试框架-gtest
Unit Test 和 gtest 介绍 单元测试( Unit Test ,模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明确的功能是否正确,通过编写单元测试可以在编码阶段发现程 ...
- 方法记录 | 文件批量导入Goodnotes
一般来说通常资料都是用网盘下载了很多文件,想用Goodnotes来写批注,记笔记等,但是由于网盘不能直接分享.也不能批量分享到Goodnotes,给学习带来了很大的麻烦. 当然有钱的大佬们呢直接开了 ...
- AtCoder ABC 164 (D~E)
比赛链接:Here ABC水题, D - Multiple of 2019 (DP + 分析) 题意: 给定数字串S,计算有多少个子串 \(S[L,R]\) ,满足 \(S[L,R]\) 是 \(2 ...
- 数论(7):康托展开&逆康托展开
康托展开可以用来求一个 \(1\sim n\) 的任意排列的排名. 什么是排列的排名? 把 \(1\sim n\) 的所有排列按字典序排序,这个排列的位次就是它的排名. 时间复杂度? 康托展开可以在 ...
- freeswitch 新通话启动过程梳理
概述 freeswitch是一款开源的VOIP软交换平台,功能强大. 在使用fs进行呼叫业务的过程中,我们最常见到的日志就是呼叫通道的启动信息,日志如下 2022-03-03 14:14:30.028 ...
- Vue第六篇 element-ui 项目管理工具npm webpack 启Vue项目vue-cli
node npm npm管理项目 npm init -y npm install xxxx@0.0.0 npm uninstall xxx npm i 下载package.json所有的依赖 webp ...
