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中ResponseWriter的一个坑
Apr 27 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
Golang 空map和未初始化map的注意事项说明
Apr 29 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
解决golang结构体tag编译错误的问题
May 02 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
golang中的struct操作
Nov 11 Golang
Go语言基础切片的创建及初始化示例详解
Nov 17 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
Golang 切片(Slice)实现增删改查
Apr 22 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 Golang
Go Grpc Gateway兼容HTTP协议文档自动生成网关
Jun 16 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 PHP
在PHP中使用模板的方法
2008/05/24 PHP
PHP 开源AJAX框架14种
2009/08/24 PHP
php 归并排序 数组交集
2011/05/10 PHP
PHP简单获取视频预览图的方法
2015/03/12 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
jQuery实现的鼠标经过时变宽的效果(附demo源码)
2016/04/28 Javascript
javascript 常用验证函数总结
2016/06/28 Javascript
javascript数组去重常用方法实例分析
2017/04/11 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
2018/08/16 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
[03:15]DOTA2-DPC中国联赛1月22日Recap集锦
2021/03/11 DOTA
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
从Python程序中访问Java类的简单示例
2015/04/20 Python
python使用mailbox打印电子邮件的方法
2015/04/30 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
2016/07/08 HTML / CSS
J2EE中常用的名词进行解释
2015/11/09 面试题
应聘面试自我评价
2014/01/24 职场文书
大学班级干部的自我评价分享
2014/02/10 职场文书
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
给孩子的新年寄语
2014/04/08 职场文书
小学生国庆节演讲稿
2014/09/05 职场文书
2014国庆节餐厅促销活动策划方案
2014/09/16 职场文书
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书
感恩老师主题班会
2015/08/12 职场文书
市级三好生竞选稿
2015/11/21 职场文书
2016教师给学生的毕业寄语
2015/12/04 职场文书
话题作文之学会尊重
2019/12/16 职场文书