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 08 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
go语言中json数据的读取和写出操作
Apr 28 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
golang goroutine顺序输出方式
Apr 29 Golang
聊聊golang中多个defer的执行顺序
May 08 Golang
入门学习Go的基本语法
Jul 07 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Go语言grpc和protobuf
Apr 13 Golang
Golang实现可重入锁的示例代码
May 25 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 Memcache 中实现消息队列
2009/11/24 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
2014/03/19 PHP
PHP session文件独占锁引起阻塞问题解决方法
2015/05/12 PHP
总结PHP中DateTime的常用方法
2016/08/11 PHP
PHP将数据导出Excel表中的实例(投机型)
2017/07/31 PHP
js查找父节点的简单方法
2008/06/28 Javascript
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
Javascript的匿名函数小结
2009/12/31 Javascript
jquery异步请求实例代码
2011/06/21 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
在JavaScript中call()与apply()区别
2016/01/22 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
bootstrap常用组件之头部导航实现代码
2017/04/20 Javascript
nodejs6下使用koa2框架实例
2017/05/18 NodeJs
详解创建自定义的Angular Schematics
2018/06/06 Javascript
Vue.js 中的实用工具方法【推荐】
2019/07/04 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
跟老齐学Python之用Python计算
2014/09/12 Python
Python求两个list的差集、交集与并集的方法
2014/11/01 Python
Python实现翻转数组功能示例
2018/01/12 Python
Django项目使用CircleCI的方法示例
2019/07/14 Python
解决pandas展示数据输出时列名不能对齐的问题
2019/11/18 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
万代美国官网:PREMIUM BANDAI USA
2020/09/11 全球购物
程序员经常用到的UNIX命令
2015/04/13 面试题
外贸主管求职简历的自我评价
2013/10/23 职场文书
运动会解说词100字
2014/01/31 职场文书
国培教师自我鉴定
2014/02/12 职场文书
安全标准化实施方案
2014/02/20 职场文书
商业计算机应用专业自荐书
2014/06/09 职场文书
2015年助残日活动总结
2015/03/27 职场文书