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语言中json数据的读取和写出操作
Apr 28 Golang
golang import自定义包方式
Apr 29 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
Go语言入门exec的基本使用
May 20 Golang
Go调用Rust方法及外部函数接口前置
Jun 14 Golang
Python测试框架pytest核心库pluggy详解
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极大的增强功能和性能
2006/10/09 PHP
PHP完整的日历类(CLASS)
2006/11/27 PHP
使用php将某个目录下面的所有文件罗列出来的方法详解
2013/06/21 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
2014/08/18 PHP
php查询mssql出现乱码的解决方法
2014/12/29 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
2015/03/18 PHP
实例介绍PHP删除数组中的重复元素
2019/03/03 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
2019/04/10 PHP
5款Javascript颜色选择器
2009/10/25 Javascript
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
jQuery实现三级菜单的代码
2016/05/09 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
vue.js或js实现中文A-Z排序的方法
2018/03/08 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
Vuex实现购物车小功能
2020/08/17 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
wxPython框架类和面板类的使用实例
2014/09/28 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
2016/06/07 Python
Python 操作文件的基本方法总结
2017/08/10 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
如何利用find命令查找文件
2015/02/07 面试题
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
金融专业银行实习证明模板
2014/11/28 职场文书
餐厅开业活动方案
2019/07/08 职场文书
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python
深入讲解Vue中父子组件通信与事件触发
2022/03/22 Vue.js