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语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
Go 实现英尺和米的简单单位换算方式
Apr 29 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
解决golang 关于全局变量的坑
May 06 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 Golang
Golang二维数组的使用方式
May 28 Golang
Golang中异常处理机制详解
Jun 08 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
Go语言编译原理之变量捕获
Aug 05 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中使用Select 查询语句的实例
2014/02/19 PHP
PHP基于CURL进行POST数据上传实例
2014/11/10 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
Laravel程序架构设计思路之使用动作类
2018/06/07 PHP
PHP执行linux命令6个函数代码实例
2020/11/24 PHP
JavaScript 保存数组到Cookie的代码
2010/04/14 Javascript
来自国外的14个图片放大编辑的jQuery插件整理
2010/10/20 Javascript
JavaScript计算字符串中每个字符出现次数的小例子
2013/07/02 Javascript
JsRender for object语法简介
2014/10/31 Javascript
JavaScript中三种异步上传文件方式
2016/03/06 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
浅析location.href跨窗口调用函数
2016/11/22 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
如何利用JQuery实现从底部回到顶部的功能
2016/12/27 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
vue代码分割的实现(codesplit)
2018/11/13 Javascript
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
wxPython使用系统剪切板的方法
2015/06/16 Python
Python中turtle作图示例
2017/11/15 Python
高质量Python代码编写的5个优化技巧
2017/11/16 Python
django使用html模板减少代码代码解析
2017/12/12 Python
Python中optparser库用法实例详解
2018/01/26 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
wxPython绘图模块wxPyPlot实现数据可视化
2019/11/19 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
2021/02/06 Python
奥地利手表、香水、化妆品和珠宝购物网站:Brasty.at
2021/01/17 全球购物
医学生自荐信范文
2013/12/03 职场文书
高中毕业生自我鉴定例文
2013/12/29 职场文书
感恩寄语大全
2014/04/11 职场文书
2016高考感言
2015/08/01 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang