Функция binary.Size

Функция binary.Size из пакета encoding/binary возвращает размер в байтах, который занимает значение при сериализации с помощью функций binary.Write или binary.Read. Она принимает один параметр - произвольное значение v, для которого нужно вычислить размер. Возвращает целое число int - количество байт или отрицательное значение, если размер не может быть определен.

Синтаксис

gobinary.Size(v any) int

Пример для чисел с фиксированным размером

Функция корректно вычисляет размер для всех целых и чисел с плавающей точкой фиксированной длины:

gopackage main

import (
  "encoding/binary"
  "fmt"
)

func main() {
  var num8 uint8 = 255
  var num16 int16 = -32000
  var num64 float64 = 3.14

  fmt.Println(binary.Size(num8))
  fmt.Println(binary.Size(num16))
  fmt.Println(binary.Size(num64))
}

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

go1
2
8

Пример для сложных структур

Размер структуры определяется суммой размеров всех ее полей с учетом выравнивания, если не используется тег binary для компактной упаковки:

gopackage main

import (
  "encoding/binary"
  "fmt"
)

type Data struct {
  ID   uint32
  Flag bool
  Age  int16
}

func main() {
  data := Data{ID: 1, Flag: true, Age: 25}
  fmt.Println(binary.Size(data))
}

Результат выполнения кода (зависит от архитектуры и выравнивания):

go8

Пример с использованием тега для управления размером

С помощью тега binary можно явно задать размер полей, что повлияет на возвращаемое значение binary.Size:

gopackage main

import (
  "encoding/binary"
  "fmt"
)

type Custom struct {
  Value uint16 `binary:"little"`
  _   [2]byte
}

func main() {
  c := Custom{Value: 100}
  fmt.Println(binary.Size(c))
}

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

go4

Пример для указателей и интерфейсов

При передаче указателя функция вычисляет размер значения, на которое он ссылается. Для интерфейсов возвращается размер динамического значения:

gopackage main

import (
  "encoding/binary"
  "fmt"
)

func main() {
  var val int32 = 42
  ptr := &val
  var iface any = int64(1234567890)

  fmt.Println(binary.Size(ptr))
  fmt.Println(binary.Size(iface))
}

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

go4
8

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

  • функцию binary.Read,
    которая читает бинарные данные в структуру
  • функцию binary.Write,
    которая записывает бинарное представление значения
  • константу binary.BigEndian,
    которая определяет порядок байтов от старшего к младшему
  • константу binary.LittleEndian,
    которая определяет порядок байтов от младшего к старшему