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原生库的中bytes.Buffer用法
Apr 25 Golang
goland 恢复已更改文件的操作
Apr 28 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 Golang
Go timer如何调度
Jun 09 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
victoriaMetrics库布隆过滤器初始化及使用详解
Apr 05 Golang
Golang 切片(Slice)实现增删改查
Apr 22 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的FTP学习(一)[转自奥索]
2006/10/09 PHP
PHP 写文本日志实现代码
2010/05/18 PHP
取得一定长度的内容,处理中文
2006/12/20 Javascript
Javascript 面向对象 命名空间
2010/05/13 Javascript
jQuery AJAX实现调用页面后台方法和web服务定义的方法分享
2012/03/01 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
一个JavaScript的求爱小特效
2014/05/09 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
2014/12/16 Javascript
js鼠标点击图片实现随机变换图片的方法
2015/02/16 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
JavaScript 随机验证码的生成实例代码
2016/09/22 Javascript
纯js实现倒计时功能
2017/01/06 Javascript
JavaScript纯色二维码变成彩色二维码
2020/07/23 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
2017/11/09 jQuery
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
[02:02]2018DOTA2亚洲邀请赛Mineski赛前采访
2018/04/04 DOTA
[56:41]iG vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/17 DOTA
[04:05]TI9战队采访 - Natus Vincere
2019/08/22 DOTA
解决pycharm运行出错,代码正确结果不显示的问题
2018/11/30 Python
Python 控制终端输出文字的实例
2019/07/12 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
使用Python函数进行模块化的实现
2019/11/15 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
上班玩游戏检讨书
2014/02/07 职场文书
公司食堂管理制度
2015/08/05 职场文书
银行柜员优质服务心得体会
2016/01/22 职场文书
sql注入教程之类型以及提交注入
2021/08/02 MySQL