#go
#Вперед
Вопрос:
Я не могу найти способ компоновки структуры для программирования массива байтов с помощью GO. Я программирую расширение для сервиса GoBGP. Я хочу настроить сообщество для маршрута через GoBGP API. Подробнее о BGP и сообществах.
Моя ситуация:
Я пытаюсь отправить 32-битное число. Во-первых, 16 бит интерпретируются как число, остальные 16 бит — сообщества. API имеет интерфейс для uint32 для установки всех этих данных. Я хочу иметь простую структуру, подобную:
type routeCommunity struct {
AS uint16
Community uint16
}
Я изо всех сил пытаюсь передать эти структурные данные в переменную uint32. Я хотел бы преобразовать ее в массив байтов, а затем я мог бы просто создать из нее uint32.
В C у меня был бы указатель структуры, указывающий на массив символов, и я продолжал бы работать с этой структурой, и, в конце концов, я бы отправил массив символов.
Как это сделать в Golang??
Ответ №1:
Вы можете передать свою структуру в переменную uint32, используя «небезопасный» пакет:
func (rc *routeCommunity) bits() uint32 {
return *(*uint32)(unsafe.Pointer(rc))
}
https://play.golang.org/p/AQeeoYUn7o0
UPD:
Имейте в виду, что расположение битов зависит от порядка расположения полей структуры. Два младших байта переменной содержат первое значение поля, а два старших байта содержат второе.
Комментарии:
1. Это действительно помогло, но есть проблема. Поля находятся в смешанном положении. Возможно ли изменить порядок размещения полей в памяти? 16 бит должны быть первыми, но теперь биты AS находятся в конце. Ситуация выглядит следующим образом: Сообщество / AS вместо AS / Community
2. @gedO Я обновил свой ответ. Пожалуйста, проверьте это.