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正则之命名分组方式
Apr 25 Golang
go语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
Golang 实现超大文件读取的两种方法
Apr 27 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
Go语言基础切片的创建及初始化示例详解
Nov 17 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
Golang jwt身份认证
Apr 20 Golang
Golang 结构体数据集合
Apr 22 Golang
Go语言编译原理之源码调试
Aug 05 Golang
Go gorilla securecookie库的安装使用详解
Aug 14 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学习教程之第2天
2008/06/15 PHP
php设计模式 Factory(工厂模式)
2011/06/26 PHP
php跨域cookie共享使用方法
2014/02/20 PHP
ThinkPHP模板判断输出Defined标签用法详解
2014/06/30 PHP
php文件压缩之PHPZip类用法实例
2015/06/18 PHP
Zend Framework实现多文件上传功能实例
2016/03/21 PHP
php微信公众平台开发(四)回复功能开发
2016/12/06 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
jquery实现居中弹出层代码
2010/08/25 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
node.js中的fs.futimes方法使用说明
2014/12/17 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
深入理解Node中的buffer模块
2017/06/03 Javascript
AngularJS service之select下拉菜单效果
2017/07/28 Javascript
用JavaScript做简易的购物车的代码示例
2017/10/20 Javascript
Layui table field初始化加载时进行隐藏的方法
2019/09/19 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
Python的Django框架中模板碎片缓存简介
2015/07/24 Python
Python实现简单的代理服务器
2015/07/25 Python
一张图带我们入门Python基础教程
2017/02/05 Python
Python实现多线程HTTP下载器示例
2017/02/11 Python
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
python 生成器和迭代器的原理解析
2019/10/12 Python
PyTorch的torch.cat用法
2020/06/28 Python
Python通过zookeeper实现分布式服务代码解析
2020/07/22 Python
智利最大的网上商店:Linio智利
2016/11/24 全球购物
厨房工作人员岗位职责
2013/11/15 职场文书
技术人员面试提纲
2013/11/28 职场文书
另类冲刺标语
2014/06/24 职场文书
研究生简历自我评价范文
2014/09/13 职场文书
大学组织委员竞选稿
2015/11/21 职场文书
《七月的天山》教学反思
2016/02/19 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
为什么阅读对所有年龄段的孩子都很重要?
2019/07/08 职场文书
html粘性页脚的具体使用
2022/01/18 HTML / CSS
详解SQL报错盲注
2022/07/23 SQL Server