Работа с неразмерными массивами в Go и Windows API

Каков идиоматический способ работы с неразмерными массивами в Go? Я работаю над оболочками ETW, и функция TdhGetEventInformation заполняет предоставленный буфер памяти информацией о событии. Метаданные события представлены структурой TRACE_EVENT_INFO, член массива которой объявлен как:

EVENT_PROPERTY_INFO EventPropertyInfoArray[ANYSIZE_ARRAY];

Я вызываю функцию TdhGetEventInformation таким образом, чтобы в предоставленном буфере было достаточно места для заполнения массива свойств события:

var bufferSize uint32 = 4096
buffer := make([]byte, bufferSize)

tdhGetEventInformation.Call(
   uintptr(unsafe.Pointer(eventRecord)),
   0, 0, 
   uintptr(unsafe.Pointer(&buffer[0])),
   uintptr(unsafe.Pointer(&bufferSize)),
)

Однако, поскольку у меня возникает соблазн смоделировать аналогичную структуру Go с полем EventPropertyInfoArray как

EventPropertyInfoArray [1]EventPropertyInfo

компилятор не может изменить размер массива в соответствии с количеством доступных свойств для каждого события, поэтому я получаю один элемент массива.

Есть ли у вас какие-нибудь умные идеи о том, как справиться с этим крайним случаем?

заранее спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
138
2

Ответы 2

Итак, вам нужен массив переменного размера в Go? Использовать кусочек?

EventPropertyInfoArray [1]EventPropertyInfo

Было бы

EventPropertyInfoArray []EventPropertyInfo

Если у вас есть приблизительное представление о максимуме, который он может удерживать, вы можете создать массив, используя make что-то вроде этого, но это не поможет вам при объявлении структуры:

EventPropertyInfoArray = make([]EventPropertyInfo, len, capacity)

К сожалению, я уже пытался преобразовать массив в срез, но все, что я получаю, это срез с причудливой длиной недопустимых записей (попытка проиндексировать срез приводит к неожиданной панике адреса ошибки)

Nedo 26.02.2019 00:34

После множества проб и ошибок мне удалось получить правильный срез из резервного массива с помощью стандартной техники превращения массивов в срезы:

 properties := (*[1 << 30]EventPropertyInfo)(unsafe.Pointer(&trace.EventPropertyInfoArray[0]))[:trace.PropertyCount:trace.PropertyCount] 

Другие вопросы по теме