GO语言篇之unsafe

news/2025/2/22 4:48:11/

GO语言篇之unsafe

文章目录

  • GO语言篇之unsafe
    • 前言
    • 获取变量的内存地址
    • 将指针转换为不同类型的指针
    • 获取结构体字段的偏移量
    • 获取变量的大小和对齐方式

前言

Go语言的unsafe包可以让我们绕过类型系统,直接操作内存,但是它的操作内存的能力还是有限的

unsafe包中的函数有以下几种类型:

关于指针的函数:如Pointer型函数可以将指针转化为uintptr型,以及指针的比较、加减等操作关于引用的函数:如Sizeof函数可以计算一个变量的字节大小,Align函数返回一个类型的对齐方式,Offsetof函数返回一个结构体字段相对于结构体起始地址的偏移量

获取变量的内存地址

import ("unsafe""fmt"
)func main() {var num int = 666ptr := unsafe.Pointer(&num)fmt.Println(ptr)  // 输出变量num的内存地址
}

将指针转换为不同类型的指针

import ("unsafe""fmt"
)func main() {var num int = 666var uintNum uint = *(*uint)(unsafe.Pointer(&num))fmt.Println(num, uintNum)
}

获取结构体字段的偏移量

import ("unsafe""fmt"
)type Person struct {Name   stringAge    intHeight float64
}func main() {nameOffset := unsafe.Offsetof(Person{}.Name)ageOffset := unsafe.Offsetof(Person{}.Age)heightOffset := unsafe.Offsetof(Person{}.Height)fmt.Println(nameOffset, ageOffset, heightOffset)  // 输出字段的偏移量
}

获取变量的大小和对齐方式

import ("unsafe""fmt"
)type Person struct {Age    intWeight float64Height float64
}func main() {size := unsafe.Sizeof(Person{})align := unsafe.Alignof(Person{})fmt.Println(size, align)  // 输出结构体的大小和对齐方式
}

http://www.ppmy.cn/news/1116962.html

相关文章

如何像微信一样扫码自由?

https://github.com/devilsen/CZXing 我在使用zxing的总是想扫码的时候怎么才能够快速校准,多个二维码扫描的时候怎么才能指定二维码呢。于是我在Github上找到了CZxing这个控件。在使用的时候发现了有些小问题。 扫码结果没有回调。 回调没有反应;是因…

Python基础语法规则和Java不同的地方

Java是现在最流行的语言,也是广大程序员最熟悉的语言。然而,随着人工智能领域的快速发展,Python作为新星崭露头角。通过对比Java语言来学习Python语言,可以事半功倍。 首先,我们来看Python和Java在注释上的区别。在Jav…

Fullcalendar(简单的日程管理)

官网:FullCalendar - JavaScript Event Calendar 小Tip:有几个是付费项目 初始化: document.addEventListener(DOMContentLoaded, function() {var calendarEl document.getElementById(calendar);var calendar new FullCalendar.Calendar(calendarE…

常用的正则表达式30个,整数、浮点数、中文、英文字母、手机号、邮箱、日期、IP等等( JavaScript、Java)

前言 正则表达式(Regular Expression)是一种强大的文本模式匹配工具,它使用特定的语法规则来对字符串进行模式匹配和文本搜索。下面,LZ整理了一些常见的正则表达式模式,帮助你更好地处理数据验证。话不多说&#xff0…

MATLAB APP纯小白入门 两数相加

万事开头难,最怕第一次。使用matlab APP 实现两数求和,如下图所示,c a b,输入数字后,按 “” 就计算。 步骤 拖拽三个 Edit Field(Numeric) 过来,并且双击名字分别改为 a,b,c。注意修改名字后右边会有点变…

SOCKS5 认证的方法

在进行网络浏览或爬虫等相关工作时,我们经常会遇到需要使用 SOCKS5 代理认证的情况。然而,某些浏览器可能不提供原生支持 SOCKS5 代理认证的选项,给我们带来了一些困扰。本文将为大家介绍几种解决浏览器不支持 SOCKS5 代理认证问题的方法。 …

基于微信小程序的在线小说阅读系统,附数据库、教程

1 功能简介 Java基于微信小程序的在线小说阅读系统 微信小程序的在线小说阅读系统,系统的整体功能需求分为两部分,第一部分主要是后台的功能,后台功能主要有小说信息管理、注册用户管理、系统系统等功能。微信小程序主要分为首页、分类和我的…

爬虫项目(四):抓取网页所有图片

文章目录 一、书籍推荐二、完整代码三、运行结果 一、书籍推荐 推荐本人书籍《Python网络爬虫入门到实战》 ,详细介绍见👉: 《Python网络爬虫入门到实战》 书籍介绍 二、完整代码 原理:抓取该链接中所有的图片格式。基于seleni…