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 相关文章推荐
goland 恢复已更改文件的操作
Apr 28 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
使用golang编写一个并发工作队列
May 08 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
golang中的并发和并行
May 08 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
golang内置函数len的小技巧
Jul 25 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
Golang并发工具Singleflight
May 06 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 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
神族 Protoss 历史背景
2020/03/14 星际争霸
PHP Ajax JavaScript Json获取天气信息实现代码
2016/08/17 PHP
让Laravel API永远返回JSON格式响应的方法示例
2018/09/05 PHP
Javascript实现的分页函数
2006/12/22 Javascript
原生JS实现表单checkbook获取已选择的值
2013/07/21 Javascript
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
利用a标签自动解析URL分析网址实例
2014/10/20 Javascript
jQuery简单实现仿京东商城的左侧菜单效果代码
2015/09/09 Javascript
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
Angular ng-class详解及实例代码
2016/09/19 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
详谈表单重复提交的三种情况及解决方法
2017/08/16 Javascript
springmvc接收jquery提交的数组数据代码分享
2017/10/28 jQuery
jQuery中库的引用方法
2018/01/06 jQuery
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
2017/04/18 Python
Python简单生成随机姓名的方法示例
2017/12/27 Python
pycharm设置注释颜色的方法
2018/05/23 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
python3实现elasticsearch批量更新数据
2019/12/03 Python
Python字符串中删除特定字符的方法
2020/01/15 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
Python中random模块常用方法的使用教程
2020/10/04 Python
Python排序函数的使用方法详解
2020/12/11 Python
分享CSS3中必须要知道的10个顶级命令
2012/04/26 HTML / CSS
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
法学专业毕业生自荐信范文
2013/12/18 职场文书
大学毕业生自荐书怎么写?
2014/01/06 职场文书
优秀员工评优方案
2014/06/13 职场文书
感恩母亲节活动总结
2015/02/10 职场文书
换届选举主持词
2015/07/03 职场文书
2016年学习雷锋精神广播稿
2015/12/17 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
centos8安装MongoDB的详细过程
2021/10/24 MongoDB