go语言中切片与内存复制 memcpy 的实现操作


Posted in Golang onApril 27, 2021

Go 语言原则上不支持内存的直接操作访问,但是提供了切片功能。

最初我以为切片就是动态数组,实际程序设计过程中发现,切片是提供数组一个内存片段的一个合法的手段,利用切片功能,实际上我们可以自由访问数组的任何一个片段,因而可以借助 copy 函数,实现内存复制。

不同类型之间的数据复制,可以借助 unsafe 取出变量地址,类型转换为数组后,利用数组切片,实现内存复制。

不罗嗦了,示例代码如下:

package main
import (
    "fmt"
    "unsafe"
)
func main() {
    //数组之间的数据复制
    var a = [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    var b = [10]int{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
    copy(a[5:8], b[0:])
    fmt.Println(a, b)
    //不同数据类型之间的复制
    var c uint32 = 0x04030201
    var d [4]byte
    p := unsafe.Pointer(&c)
    q := (*[4]byte)(p)
    copy(d[0:], (*q)[0:])
    fmt.Println(d)
}

运行结果:

[0 1 2 3 4 -1 -1 -1 8 9] [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1]

[1 2 3 4]

补充:go语言之切片复制与追加

看代码吧~

package main
import (
 "fmt"
)
func main() {
 // copy示例
 // 创建一个新的更大的切片并把原分片的内容都拷贝过来
 sl_from := []int{1, 2, 3}
 sl_to := make([]int, 10)
 n := copy(sl_to, sl_from)
 fmt.Println("num:", n, "items", sl_to)
 // append追加元素
 // append 方法将0个或多个具有相同类型 s 的元素追加到切片后面并且返回新的切片
 // 追加的元素必须和原切片的元素同类型
 // 如果 s 的容量不足以存储新增元素,append 会分配新的切片来保证已有切片元素和新增元素的存储
 sl_a := []int{1, 2, 3}
 sl_a = append(sl_a, 4, 5, 6)
 fmt.Println(sl_a)
 // append 方法追加一个切片
 var sl_b []int
 sl_c := []int{1, 2, 3}
 sl_b = append(sl_b, sl_c...)
 fmt.Println(sl_b)
 // 将一个元素快速转为对应切片类型
 x := 5
 Test([]int{x})
}
func Test(x []int)  {
 fmt.Println(x)
}

运行结果:

num: 3 items [1 2 3 0 0 0 0 0 0 0]

[1 2 3 4 5 6]

[1 2 3]

[5]

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
一文读懂go中semaphore(信号量)源码
Apr 03 Golang
go语言求任意类型切片的长度操作
Apr 26 Golang
go语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
彻底理解golang中什么是nil
Apr 29 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
go xorm框架的使用
May 22 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
Go语言入门exec的基本使用
May 20 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 Golang
Go语言中的UTF-8实现
Apr 26 #Golang
golang中实现给gif、png、jpeg图片添加文字水印
Apr 26 #Golang
Go语言带缓冲的通道实现
Apr 26 #Golang
go语言求任意类型切片的长度操作
Apr 26 #Golang
golang如何去除多余空白字符(含制表符)
Apr 25 #Golang
用golang如何替换某个文件中的字符串
Apr 25 #Golang
Golang 正则匹配效率详解
You might like
浅析PHP递归函数返回值使用方法
2013/02/18 PHP
PHP循环结构实例讲解
2014/02/10 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
php/JS实现的生成随机密码(验证码)功能示例
2019/06/06 PHP
PHP实现cookie跨域session共享的方法分析
2019/08/23 PHP
jQuery 使用手册(二)
2009/09/23 Javascript
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
javascript表单正则应用
2017/02/04 Javascript
canvas绘图不清晰的解决方案
2017/02/28 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
vue实现移动端图片裁剪上传功能
2020/08/18 Javascript
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
2019/03/13 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
js中的this的指向问题详解
2019/08/29 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
2020/07/31 Javascript
Vue的Options用法说明
2020/08/14 Javascript
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
flask框架实现连接sqlite3数据库的方法分析
2018/07/16 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
ASOS亚洲:ASOS Asia
2018/03/04 全球购物
椰子猫砂:CatSpot
2018/08/27 全球购物
营业经理岗位职责
2013/11/10 职场文书
男方婚礼答谢词
2015/01/20 职场文书
商务考察邀请函模板
2015/02/02 职场文书
教师聘用意向书
2015/05/11 职场文书
KTV员工管理制度
2015/08/06 职场文书
Python Flask搭建yolov3目标检测系统详解流程
2021/11/07 Python
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技
剧场版《转生恶役只好拔除破灭旗标》公开最新视觉图 2023年上映
2022/04/02 日漫
MySQL创建管理KEY分区
2022/04/13 MySQL