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 interface{}==nil 的几种坑及原理分析
Apr 24 Golang
golang import自定义包方式
Apr 29 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
Go标准容器之Ring的使用说明
May 05 Golang
golang switch语句的灵活写法介绍
May 06 Golang
Go 自定义package包设置与导入操作
May 06 Golang
Go语言设计模式之结构型模式
Jun 22 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
golang生成并解析JSON
Apr 14 Golang
Go Grpc Gateway兼容HTTP协议文档自动生成网关
Jun 16 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/10/21 PHP
深入理解PHP内核(二)之SAPI探究
2015/11/10 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
js直接编辑当前cookie的脚本
2008/09/14 Javascript
JS input 数字验证代码
2009/07/30 Javascript
javascript定时保存表单数据的代码
2011/03/17 Javascript
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
js获取浏览器的可视区域尺寸的实现代码
2011/11/30 Javascript
基于jquery tab切换(防止页面刷新)
2012/05/23 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
jQuery使用removeClass方法删除元素指定Class的方法
2015/03/26 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
js实现微博发布小功能
2017/01/12 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
2017/09/19 jQuery
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
Vue之封装公用变量以及实现方式
2020/07/31 Javascript
python 读取Linux服务器上的文件方法
2018/12/27 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
python切割图片的示例
2020/11/12 Python
使用CSS3的rem属性制作响应式页面布局的要点解析
2016/05/24 HTML / CSS
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
.net面试题
2015/12/22 面试题
大三学生入党思想汇报
2014/01/02 职场文书
《画杨桃》教学反思
2014/04/13 职场文书
2014国庆节标语口号
2014/09/19 职场文书
反对四风自我剖析材料
2014/10/07 职场文书
2015年保洁员工作总结
2015/05/04 职场文书
普通员工辞职信范文
2015/05/12 职场文书
2015教师个人师德工作总结
2015/10/23 职场文书
2019年最新借条范本!
2019/07/08 职场文书
基于PyTorch实现一个简单的CNN图像分类器
2021/05/29 Python