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 相关文章推荐
golang json数组拼接的实例
Apr 28 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
golang switch语句的灵活写法介绍
May 06 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
go web 预防跨站脚本的实现方式
Jun 11 Golang
victoriaMetrics库布隆过滤器初始化及使用详解
Apr 05 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
golang使用map实现去除重复数组
Apr 14 Golang
Golang bufio详细讲解
Apr 21 Golang
Golang ort 中的sortInts 方法
Apr 24 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添加Xdebug扩展的方法
2014/02/12 PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
2014/07/04 PHP
zend framework框架中url大小写问题解决方法
2014/08/19 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
2020/06/28 PHP
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
某页码显示的helper 少量调整,另附js版
2010/09/12 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
JavaScript将Table导出到Excel实现思路及代码
2013/03/13 Javascript
自动设置iframe大小的jQuery代码
2013/09/11 Javascript
javascript实现支持移动设备画廊
2015/08/24 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
2016/02/14 Javascript
jQuery+CSS3+Html5实现弹出层效果实例代码(附源码下载)
2016/05/16 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
node前端模板引擎Jade之标签的基本写法
2018/05/11 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
2018/10/22 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
js实现单元格拖拽效果
2020/02/10 Javascript
Vue实现穿梭框效果
2020/09/30 Javascript
[02:57]DOTA2亚洲邀请赛小组赛第四日 赛事回顾
2015/02/02 DOTA
python中的字典详细介绍
2014/09/18 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
python中如何实现将数据分成训练集与测试集的方法
2019/09/13 Python
Python aiohttp百万并发极限测试实例分析
2019/10/26 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
python类共享变量操作
2020/09/03 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
教师一岗双责责任书
2014/04/16 职场文书
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python
Redis基于Bitmap实现用户签到功能
2021/06/20 Redis
科普 | 业余无线电知识-波段篇
2022/02/18 无线电
MongoDB支持的索引类型
2022/04/11 MongoDB