Функция unsafe.Sizeof

Функция unsafe.Sizeof возвращает размер в байтах, который занимает переданное ей значение в памяти компьютера. В первый параметр мы передаем значение любого типа, а функция возвращает его размер в виде числа типа uintptr. Эта функция находится в пакете unsafe и относится к низкоуровневым операциям, поэтому требует осторожного использования.

Синтаксис

gounsafe.Sizeof(value)

Пример

Давайте получим размер целого числа типа int:

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  var num int = 42
  res := unsafe.Sizeof(num)
  fmt.Println(res)
}

Результат выполнения кода:

go"8"

Пример

Давайте сравним размеры различных числовых типов:

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  var i8 int8 = 1
  var i16 int16 = 1
  var i32 int32 = 1
  var i64 int64 = 1

  fmt.Println(unsafe.Sizeof(i8))
  fmt.Println(unsafe.Sizeof(i16))
  fmt.Println(unsafe.Sizeof(i32))
  fmt.Println(unsafe.Sizeof(i64))
}

Результат выполнения кода:

go"1"
"2"
"4"
"8"

Пример

Давайте получим размер строки и слайса:

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  str := "abcde"
  slice := []int{1, 2, 3, 4, 5}

  fmt.Println(unsafe.Sizeof(str))
  fmt.Println(unsafe.Sizeof(slice))
}

Результат выполнения кода:

go"16"
"24"

Пример

Давайте получим размер структуры с полями разных типов:

gopackage main

import (
  "fmt"
  "unsafe"
)

type Person struct {
  Name string
  Age  int32
  IsActive bool
}

func main() {
  p := Person{Name: "John", Age: 30, IsActive: true}
  res := unsafe.Sizeof(p)
  fmt.Println(res)
}

Результат выполнения кода:

go"24"

Смотрите также

  • функцию unsafe.Alignof,
    которая возвращает выравнивание значения в памяти
  • функцию unsafe.Offsetof,
    которая возвращает смещение поля структуры в байтах
  • тип unsafe.Pointer,
    который позволяет работать с указателями произвольных типов
  • функцию unsafe.Add,
    которая выполняет арифметику указателей