Я реализую сетевой пакет на Голанге.Это уже было реализовано в C ++.Цель состоит в том, чтобы заставить реализованный клиент golang связываться с внедренным сервером C ++.
Они будут общаться пакетами.Структура пакета:
type Packet struct {
length uint32
nameLen uint8
data []byte
} // in golang
struct Packet {
uint32_t length;
uint8_t nameLen;
byte data[];
} // in C++
Подчеркнутая структура - это байтовый массив.При получении сообщения в формате байтового массива.Нам нужно перевести его в пакет.
auto p = reinterpret_cast<Packet*>(buffer); // in c++
(buffer's alignment is manually set as 64)
p := (Packet)(unsafe.Pointer(&buffer)) // in golang
Чтобы заставить их общаться, их выравнивание структуры должно оставаться прежним.
Здесь возникает вопрос: после распечатки их выравнивания я получаю это:
type Packet struct {
length uint32 // alignment 8
nameLen uint8 // alignment 8
data []byte // alignment 8
}
struct Packet {
uint32_t length; // alignment 4
uint8 nameLen; // alignment 4
data []byte; // alignment 1
}
Они будут декодировать сообщение по-разному из-за различного выравнивания.
Я не могу изменить код C ++.
Q1: Есть лиЕсть ли способ установить выравнивание структурных полей в golang?
Q2: Есть ли лучший способ реализовать пакет golang, чтобы избежать несоответствия выравнивания при приведении буфера в пакет?