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语言map与string的相互转换的实现
Apr 07 Golang
golang判断key是否在map中的代码
Apr 24 Golang
go:垃圾回收GC触发条件详解
Apr 24 Golang
golang如何去除多余空白字符(含制表符)
Apr 25 Golang
golang中切片copy复制和等号复制的区别介绍
Apr 27 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
golang 语言中错误处理机制
Aug 30 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
Go归并排序算法的实现方法
Apr 06 Golang
golang语言指针操作
Apr 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
phpmyadmin的#1251问题
2006/11/25 PHP
发一个php简单的伪原创程序,配合商城采集用的
2010/10/12 PHP
php实现文件下载简单示例(代码实现文件下载)
2014/03/10 PHP
PHP正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
深入讲解PHP的Yii框架中的属性(Property)
2016/03/18 PHP
javascript的函数、创建对象、封装、属性和方法、继承
2011/03/10 Javascript
创建公共调用 jQuery Ajax 带返回值
2012/08/01 Javascript
你必须知道的Javascript知识点之"this指针"的应用
2013/04/23 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
2017/05/01 jQuery
详解Angular 开发环境搭建
2017/06/22 Javascript
JavaScript 保护变量不被随意修改的实现代码
2017/09/27 Javascript
Vue组件之Tooltip的示例代码
2017/10/18 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
微信小程序纯文本实现@功能
2020/04/08 Javascript
分享Python文本生成二维码实例
2016/01/06 Python
使用Python写个小监控
2016/01/27 Python
Python中Selenium模拟JQuery滑动解锁实例
2017/07/26 Python
Python中常用信号signal类型实例
2018/01/25 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
python getpass模块用法及实例详解
2019/10/07 Python
如何用 Python 制作一个迷宫游戏
2021/02/25 Python
大学生文员专业个人求职信范文
2014/01/05 职场文书
支教自我鉴定
2014/01/18 职场文书
高一物理教学反思
2014/01/24 职场文书
美术教学感言
2014/02/22 职场文书
2014年秋季开学演讲稿
2014/05/24 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
高一数学教学反思
2016/02/18 职场文书
2019自荐信该如何写呢?
2019/07/05 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python
关于Python中进度条的六个实用技巧分享
2022/04/05 Python
Redis Lua脚本实现ip限流示例
2022/07/15 Redis
pytest实现多进程与多线程运行超好用的插件
2022/07/15 Python