首页 > 其他分享 >【踩了一个坑】为什么 golang struct 中的 slice 无法原子赋值

【踩了一个坑】为什么 golang struct 中的 slice 无法原子赋值

时间:2024-01-20 09:13:47浏览次数:30  
标签:arr slice struct int MySt golang Field func byte

作者:张富春(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
}

仍然无法理解我为社么错了,求指教。

标签:arr,slice,struct,int,MySt,golang,Field,func,byte
From: https://www.cnblogs.com/ahfuzhang/p/17976007

相关文章

  • 数独Sudoku游戏解题C语言和Golang(Go语言)实现
    Go语言实现packagemainimport( "fmt" "os")const( N=9 EmptyCell='0')funcmain(){ iflen(os.Args)!=2||len(os.Args[1])!=81{ fmt.Println("错误:程序需要一个正好包含81位数字的参数。") os.Exit(1) } boa......
  • Golang静态类型、编译型的语言学习
    golang属于一种静态类型、编译型的语言,它的设计目标是提供一种简单、高效、可靠的编程语言,适用于构建大型软件系统。Go语言的设计哲学是简洁、直接、易于理解和使用,Go语言支持并发编程,引入了goroutine和channel的概念,使得并发编程更加简单和高效,无论是用于Web开发、服务器编程、......
  • Golang之文件系统事件监听
    Golang之文件系统事件监听基本介绍文件系统事件是指文件系统相关的各种操作和状态变化,当一个应用层的进程操作文件或目录时,会触发systemcall,内核的notification子系统可以守在那里,把该进程对文件的操作上报给应用层的监听进程。这些事件可以包括文件和目录的创建、修改、删除和......
  • Golang中的工厂模式:灵活选择存储方式实现文件存储
    Golang中的工厂模式:灵活选择存储方式实现文件存储原创 沙蒿 程序员的碎碎念 2024-01-0508:20 发表于广东 听全文 引言在现代软件开发中,文件存储是一个常见的需求,而选择合适的存储方式对于系统的可扩展性和性能至关重要。本文将介绍如何使用工厂模式在Golang中实......
  • mac m1 golang 运行go项目没法dbg解决
    1.首先终端看 uname-m如果是显示armd的话就是m12.go版本需要安装arm64版本(macm1) 3.golang编辑器也要安装m1版本的 4.dbg成功 ......
  • Development and Construction of Dapp Pledge Mining System
    Pledgeminingsystemisanemergingapplicationofblockchaintechnology,whichpledgesdigitalassetsontheblockchaintoobtaincorrespondingproofofequity,inordertoachieveproofofequityminingontheblockchain.Thedevelopmentofpledgeminin......
  • Golang nil != nil
    先从一段代码看起,下面这个代码是将传入的对象转换成JSONstring并返回回去,其中,如果判断i==nil时,会返回""。funcToJSONString(iinterface{})string{ifi==nil{return""}bytes,_:=json.Marshal(i)returnstring(bytes)}这段代码初看并没有......
  • golang 处理未确定json字符串
    json字符串转golangmap我们知道golang处理json字符串时,需要先转成struct,并且struct必须是确定的。有时候我们传递的json是不固定的,针对每种情况都写一个struct比较麻烦,有没有处理不确定json的方法呢?答案是有的 varastring="{\"a\":1,\"b\":\"xx\"}" varbmap[string]in......
  • python 切片slice和实现一个切片类
    alist=[2,5,32,34,11,44,65,113]print(alist[::])##取所有alist[2,5,32,34,11,44,65,113]print(alist[::-1])##alist倒序[113,65,44,11,34,32,5,2]print(alist[::2])##取alist偶数位数值[2,32,11,65]print(alist[1::2])##取alist奇数位数值[5,34,44,......
  • vite 生产打包后报错 xx is not a constructor
    版本vite:"^5.0.11"解决方法添加optimizeDeps.disabled=false和build.commonjsOptions.include=[]。vite.config.tsimport{defineConfig}from'vite'importreactfrom'@vitejs/plugin-react'exportdefaultdefineConfig({plu......