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 slice元素去重操作
Apr 30 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
Go语言grpc和protobuf
Apr 13 Golang
Golang 入门 之url 包
May 04 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 Golang
Go 内联优化让程序员爱不释手
Jun 21 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
正则表达式语法
2006/10/09 Javascript
php的大小写敏感问题整理
2011/12/29 PHP
Codeigniter出现错误提示Error with CACHE directory的解决方案
2014/06/12 PHP
PHP实现JS中escape与unescape的方法
2016/07/11 PHP
DOM基础教程之事件类型
2015/01/20 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
ES6中参数的默认值语法介绍
2017/05/03 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
深入理解基于vue-cli的vuex配置
2017/07/24 Javascript
使用ajax的post同步执行(实现方法)
2017/12/21 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
2018/04/18 Javascript
JavaScript常用数学函数用法示例
2018/05/14 Javascript
vue配置接口域名方法总结
2019/05/12 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
Python使用Supervisor来管理进程的方法
2015/05/28 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
pymongo中group by的操作方法教程
2019/03/22 Python
详解用python写一个抽奖程序
2019/05/10 Python
python中@property和property函数常见使用方法示例
2019/10/21 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
Groupon西班牙官方网站:在线优惠券和交易,节省高达70%
2021/03/13 全球购物
教师一岗双责责任书
2014/04/16 职场文书
销售求职信范文
2014/05/26 职场文书
五一口号
2014/06/19 职场文书
音乐教师求职信范文
2015/03/20 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
Python获取百度热搜的完整代码
2021/04/07 Python
基于CSS3画一个iPhone
2021/04/21 HTML / CSS