实现golang中memset函数
C语言中的memset
在C/C++中,有一个memset函数,常常用来清空一段内存。
#include <string.h>
// 将s的前n个字节用c填充
void *memset(void *s, int c, size_t n);// 用法举例
int arr[100];
// 将数组内存全部置为0
memset(&arr, 0, sizeof(arr));
由于是s是void* 类型的指针,那么任何类型的内存都可以清空。但是在golang中,类型检查特别严格,并没有提供类似的函数。
Golang中一种实现
// 可以填充数组、结构体
func MemSet(s unsafe.Pointer, c byte, n uintptr) {ptr := uintptr(s)var i uintptrfor i = 0; i < n; i++ {pByte := (*byte)(unsafe.Pointer(ptr + i))*pByte = c}
}func main() {var arr [10]int32MemSet(unsafe.Pointer(&arr), 1, unsafe.Sizeof(arr))fmt.Printf("%+v\n", arr)MemSet(unsafe.Pointer(&arr), 0, unsafe.Sizeof(arr))fmt.Printf("%+v\n", arr)
}
// 输出:
[KentZhang@LOCAL-192-168-97-2]$ go run memset.go
[16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009]
[0 0 0 0 0 0 0 0 0 0]
三点说明:
- unsafe.Pointer 是一种通用的指针类型,可以将任何数据类型的指针转化为 unsafe.Pointer,相当于C语言中的void*指针。
- unsafe.Pointer不能进行计算,即指针不能加减偏移计算,所以还必须转化为uintptr类型,uintptr本质上是一个整数,于是就可以计算了。
- uintptr是整数,不是指针,无法进行取值赋值运算,还要转化为unsafe.Pointer,再转为对应类型的指针。
实现golang中memset函数相关推荐
- c++ memset 语言_C++中memset函数用法详解
本文实例讲述了C++中memset函数用法.分享给大家供大家参考,具体如下: 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常 ...
- c++ memset 语言_C/C++ 中memset() 函数详解及其作用介绍
memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的: 包含在头文件中,可以用它对一片内存空间逐字节进行初始化: 原型为 : void *memset(void *s, int v, si ...
- 浅谈C++中memset函数的用法
浅谈C++中memset函数的用法 memset函数的头文件是cstring, 实际上是一个字符串处理函数,但常用于给静态数组(不是new出来的数组)赋特定初值. #include<cstrin ...
- C/C++中memset()函数
函数介绍 memset()函数的作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作. void *memset(void *s, int ch, size_t n) ...
- C++中memset函数详解
memset函数定义于<string.h>头文件中. 函数原型: void *memset(void *s,int c,unsigned long n); 函数功能:为指针变量s所指的前n ...
- C语言C++中memset()函数使用和注意事项
memset()函数原型 void * memset (void * ptr, int value, size_t num); memset()功能和参数 用value填充ptr指针指向的内存块开始的 ...
- C++中memset函数用法
头文件说明: C中为<memory.h> 或 <string.h> C++中为<cstring> 功能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定 ...
- golang中container/list包中的坑
转载地址:golang中container/list包中的坑 - Go语言中文网 - Golang中文社区 golang中list包用法可以参看golang中container/list包用法_che ...
- golang的闭包函数理解
golang中在函数中不能声明一个函数,但是可以在函数中声明匿名函数,统称闭包. 最开始接触golang时,对这一块不是特别理解,通过以下代码进行了解: 函数返回是个func()函数,返回的就是闭包函 ...
最新文章
- 【Flutter】监听滚动动作 控制组件 透明度渐变 ( 移除顶部状态栏空白 | 帧布局组件 | 透明度组件 | 监听滚动组件 )
- 153是一个非常特殊的数,它等于它的每位数字的立方和
- dealloc 的水,很深?
- spring中配置数据源
- 【汇编语言与计算机系统结构笔记18】MIPS指令集与汇编程序设计 异常处理
- tensorflow sigmoid 如何计算训练数据的正确率_初探 TensorFlow.js
- LaTeX 注释一行的某一部分
- 一键解决Win10 LTSC 2021官方镜像存在的问题
- mac php fpm 502,nginx+php-fpm出现502(Bad Gateway)错误的分析与解决 | linux系统运维
- 面试官问你“有什么问题问我吗?”,你该如何回答? 1
- linux接口vlan tag,linux c vlan tag 技术详解
- 【面试笔试-c/c++】人民搜索2012校园招聘试题
- Batch Normalization论文翻译——中英文对照
- 如何解决WORD安全模式错误问题
- 对于操作系统32位amp;64位寻址地址的理解
- 【算法笔记】二叉树之基础遍历
- 凤凰新闻岳建雄:互联网已经成为传统行业
- markdown如何调整行距_反Markdown试验:用Markdown的思维来使用Word
- 防火墙用户管理和入侵防御简介
- fs.mkdir创建目录报错