在Go和Windows API中处理大小不一的数组

What is the idiomatic way to deal with unsized arrays in Go? I'm working on the ETW wrappers and the TdhGetEventInformation function fills in the provided memory buffer with event information. The event metadata is represented by TRACE_EVENT_INFO structure, which has an array member declared as:

EVENT_PROPERTY_INFO EventPropertyInfoArray[ANYSIZE_ARRAY];

I'm calling the TdhGetEventInformation function in a way that the provided buffer has enough space to populate event properties array:

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)),
)

However, since I'm tempting to model the Go counterpart struct with EventPropertyInfoArray field as

EventPropertyInfoArray [1]EventPropertyInfo

the compiler is not able to re dimension the array according to the number of available properties for each event, so I end up with one-array item.

Do you have any smart ideas on how handle this edge case?

Thanks in advance

So you want a variable sized array in Go? Use a slice?

EventPropertyInfoArray [1]EventPropertyInfo

Would be

EventPropertyInfoArray []EventPropertyInfo

If you have a rough idea of a maximum it could hold you could make an array using make something like this, but this wouldn't help you out in declaring a struct:

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

After lots of trial and error, I managed to get the right slice from the backing array through standard technique for turning arrays into slices:

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