Golang: unsafe包的使用

本文详细介绍了Golang中unsafe包的使用,包括各种类型所占空间的字节数,如string、slice、指针的内存占用。讨论了类型转换,特别是指针相关的类型转换,如unsafe.Pointer和uintptr。同时,文章讲解了如何利用unsafe包操作结构体的私有变量,并特别强调了在[]byte与string类型互转时的注意事项,如转换后的[]byte数组不能直接修改,而强转后的操作可能导致panic。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. golang各类型占空间字节数

package main

import (
	"fmt"
	"unsafe"
)

var tByte byte
var tRune rune
var tInt32 int32
var tInt int
var tInt64 int64
var tFloat32 float32
var tFloat64 float64
var tComplex64 complex64
var tComplex128 complex128
var tEmptyStruct struct{
   }
var tStruct struct{
    string }
var tStructInt struct{
    int }
var tString string
var tByteSlice []byte
var tStringSlice []string
var tIntMap map[int]struct{
   }
var tStringMap map[string]struct{
   }
var tIntChan chan int
var tStringChan chan string
var tIntPointer *int
var tStringPointer *string
var tUintptr uintptr

func printTypeSize() {
   
	fmt.Println("byte size:", unsafe.Sizeof(tByte))                    // 1
	fmt.Println("rune size:", unsafe.Sizeof(tRune))                    // 4
	fmt.Println("int32 size:", unsafe.Sizeof(tInt32))                  // 4
	fmt.Println("int size:", unsafe.Sizeof(tInt))                      // 8
	fmt.Println("int64 size:", unsafe.Sizeof(tInt64))                  // 8
	fmt.Println("float32 size:", unsafe.Sizeof(tFloat32))              // 4
	fmt.Println("float64 size:", unsafe.Sizeof(tFloat64))              // 8
	fmt.Println("complex64 size:", unsafe.Sizeof(tComplex64))          // 8
	fmt.Println("complex128 size:", unsafe.Sizeof(tComplex128))        // 16
	fmt.Println("empty struct size:", unsafe.Sizeof(tEmptyStruct))     // 0
	fmt.Println("struct string size:", unsafe.Sizeof(tStruct))         // 16
	fmt.Println("struct int size:", unsafe.Sizeof(tStructInt))         // 8
	fmt.Println(&#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值