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 Gin实现文件上传下载的示例代码
Apr 02 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
go语言中json数据的读取和写出操作
Apr 28 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
Go 自定义package包设置与导入操作
May 06 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
入门学习Go的基本语法
Jul 07 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
Golang 遍历二叉树
Apr 19 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基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
PHP实现XML与数据格式进行转换类实例
2015/07/29 PHP
PHP执行linux命令常用函数汇总
2016/02/02 PHP
利用PHP访问带有密码的Redis方法示例
2017/02/09 PHP
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
写的htc的数据表格
2007/01/20 Javascript
用JavaScript隐藏控件的方法
2009/09/21 Javascript
JavaScript DOM 学习第七章 表单的扩展
2010/02/19 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/03 Javascript
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
jsPDF生成pdf后在网页展示实例
2014/01/16 Javascript
JavaScript初学者建议:不要去管浏览器兼容
2014/02/04 Javascript
js toFixed()方法的重写实现精度的统一
2014/03/06 Javascript
js+html5绘制图片到canvas的方法
2015/06/05 Javascript
jquery实现tab键进行选择后enter键触发click行为
2017/03/29 jQuery
JavaScript之Date_动力节点Java学院整理
2017/06/28 Javascript
详解一个小实例理解js原型和继承
2019/04/24 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
Vuex实现简单购物车
2021/01/10 Vue.js
使用Nginx+uWsgi实现Python的Django框架站点动静分离
2016/03/21 Python
TensorFlow实现AutoEncoder自编码器
2018/03/09 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
一文了解Python并发编程的工程实现方法
2019/05/31 Python
Python Selenium截图功能实现代码
2020/04/26 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
python 数据类型强制转换的总结
2021/01/25 Python
保安公司服务承诺书
2014/05/28 职场文书
车队安全员岗位职责
2015/02/15 职场文书
环卫处个人工作总结
2015/03/04 职场文书
2015年市场部工作总结
2015/04/30 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书
小学思品教学反思
2016/02/20 职场文书