首页 > 其他分享 >Golang unsafe.Sizeof 函数代码示例

Golang unsafe.Sizeof 函数代码示例

时间:2023-12-07 10:05:33浏览次数:28  
标签:字节 示例 unsafe Golang Person 大小 对齐 Sizeof


在 Go 语言中,可以使用 unsafe.Sizeof() 函数来获取变量或类型的大小(以字节为单位)。下面是一个示例代码,演示如何使用 unsafe.Sizeof() 函数:

package main

import (
	"fmt"
	"unsafe"
)

type Person struct {
	Name string
	Age  int
}

func main() {
	var num int
	var str string
	var person Person

	fmt.Println("Size of int:", unsafe.Sizeof(num))
	fmt.Println("Size of string:", unsafe.Sizeof(str))
	fmt.Println("Size of Person:", unsafe.Sizeof(person))
}

在这个示例中,我们声明了几个不同类型的变量:num 是一个整数,str 是一个字符串,person 是一个自定义的结构体类型 Person。然后,我们使用 unsafe.Sizeof() 函数分别获取这些变量的大小,并打印出来。

输出结果可能会有所不同,因为它取决于所使用的操作系统和架构。这是一个示例输出:

Size of int: 8
Size of string: 16
Size of Person: 24

要计算结构体的大小,可以将结构体的成员按照其对齐规则进行排列,并计算每个成员的大小。对于一个结构体,其大小由所有成员的大小之和决定,同时还要考虑对齐规则和填充字节。

在 Go 中,结构体的对齐规则是按照其成员中占用最大字节的类型进行对齐。具体来说,对于大多数基本类型(如整数、浮点数、指针等),其大小通常是对齐到它们自己的大小,例如 4 字节对齐或 8 字节对齐。对于复合类型(如结构体),其大小通常是对齐到其成员中最大类型的大小。

在示例中,Person 结构体有两个成员:NameAge。根据对齐规则,Name 的大小是 string 类型的大小(通常为 16 字节),而 Age 的大小是 int 类型的大小(通常为 8 字节)。因此,结构体 Person 的大小为 16 + 8 = 24 字节。

需要注意的是,结构体的大小可能因编译器、操作系统和目标架构的不同而有所变化。此外,填充字节的存在也可能会影响结构体的大小。因此,实际的结构体大小可能与示例中的结果略有不同。

使用 unsafe.Sizeof() 函数可以方便地获取结构体的大小,但是它不考虑填充字节,因此得到的结果可能与实际的内存占用有所差异。在一般情况下,应该避免依赖于结构体的具体大小,而是根据具体需求来设计和使用结构体。

注意,unsafe.Sizeof() 函数返回的是变量或类型占用的内存大小,但不考虑内存对齐和填充的影响。因此,结果可能会因编译器和目标架构的不同而有所变化。

需要注意的是,unsafe.Sizeof() 函数应该谨慎使用,并且只在特定情况下使用,比如在与底层 C
代码交互或进行底层系统编程时。在一般的应用程序代码中,应该遵循 Go 语言的类型安全和可移植性原则,避免依赖于变量或类型的大小。


标签:字节,示例,unsafe,Golang,Person,大小,对齐,Sizeof
From: https://blog.51cto.com/zhangxueliang/8718155

相关文章

  • Golang runtime包代码示例
    在Go中,runtime包提供了与运行时系统(runtimesystem)交互的功能。这个包包含了一些底层的运行时操作,例如内存管理、协程管理、垃圾回收等。以下是一个简单的示例代码,展示了runtime包的一些常见用法:packagemainimport( "fmt" "runtime")funcmain(){ //获取Go程序......
  • Golang GC是标记清除GC算法吗?与复制算法、标记整理算法的区别
    Golang(Go语言)使用的是标记清除(MarkandSweep)的垃圾回收(GC)算法。下面是标记清除算法与复制算法以及标记整理算法之间的区别和优势:标记清除算法(MarkandSweep):工作原理:标记清除算法分为标记和清除两个阶段。首先,从根对象(如全局变量、堆栈中的对象)开始,标记所有可以访问到的对象。然后......
  • Golang标准库:非类型安全操作(Arbitrary 类型 Pointer 类型 Sizeof 函数 Offsetof 函数)
    unsafe库徘徊在“类型安全”边缘,由于它们绕过了Golang的内存安全原则,一般被认为使用该库是不安全的。但是,在许多情况下,unsafe库的作用又是不可替代的,灵活地使用它们可以实现对内存的直接读写操作。在reflect库、syscall库以及其他许多需要操作内存的开源项目中都有对它的引用。un......
  • 通过PowerShellPlus示例脚本学习PowerShell之-通过SMO获取SQLServer数据库
    ##=====================================================================##Title:Get-MSSQL-DB-UsingSMO##Description:ShowalldatabasesusingSMOforagivenserverinstance##Author:Idera##Date:1/28/2008##Input:-s......
  • golang的try catch 方式
    列子如下:main.go 1try.Catch(func(errerror){2//异常处理3fmt.Println(err)4}).Then(func()error{5//执行代码16//...78//如果有异常即抛出异常9returnnil10}).Then(func()error{11//执行代码212/......
  • cerbos golang 内部policy check 处理简单说明
    主要是想尝试实现一个rust的check方法,所以先研究下golang的内部实现CheckResourcesfunc(cs*CerbosService)CheckResources(ctxcontext.Context,req*requestv1.CheckResourcesRequest)(*responsev1.CheckResourcesResponse,error){log:=logging.......
  • jsmn示例使用
    前言jsmn是一款超级精简的c语言json解释器,用于嵌入式进行json数据解析特别友好。官方库:https://github.com/zserge/jsmn/tree/masterjsmn(pronouncedlike'jasmine')isaminimalisticJSONparserinC.Itcanbeeasilyintegratedintoresource-limitedorembedde......
  • golang的蓝牙通信库
    github.com/tinygo-org/bluetooth:TinyGo是一个Go语言编译器,它专注于微控制器和小型计算机系统。这个库是TinyGo项目的一部分,用于支持蓝牙低功耗(BLE)设备。github.com/go-ble/ble:这是一个轻量级的Golang库,旨在简化与蓝牙低功耗设备的交互。它支持多种平台,并提供了一种简单的A......
  • systemd使用示例
    [Unit]Description=monitorsg_ai_framework_boxAfter=network.target[Service]User=rootType=forkingExecStart=/data/script/run/start.shExecStop=/data/script/run/stop.shPrivateTmp=trueRestart=always[Install]WantedBy=multi-user.target 1.启动nfs服务systemctl s......
  • golang之媒体处理
    [视频]获取视频封面图:1)如果是使用oss的话,可以添加指定的后缀生成指定图片  获取视频长度:1)若是oss上的视频,则可以使用阿里云的IMM中的提取视频信息的服务注意这里获取需要使用到签名之后获取对应的数据 这里使用基于阿里云oss包: github.com/aliyun/aliyun-o......