Go中处理unsized数组的惯用方法是什么?我正在研究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)),
)
但是,因为我很想用Qazxswpoi字段模拟Go对应结构
EventPropertyInfoArray
编译器无法根据每个事件的可用属性数量来重新确定数组的大小,因此我最终得到了一个数组项。
你对如何处理这种边缘情况有什么明智的想法吗?
提前致谢
所以你想在Go中使用可变大小的数组?用一片?
EventPropertyInfoArray [1]EventPropertyInfo
将会
EventPropertyInfoArray [1]EventPropertyInfo
如果你粗略地了解了它可以保持的最大值,你就可以使用make这样的东西制作一个数组,但是这不会帮助你声明一个结构:
EventPropertyInfoArray []EventPropertyInfo
经过大量的反复试验,我设法通过标准技术从支持阵列中获取正确的切片,将数组转换为切片:
EventPropertyInfoArray = make([]EventPropertyInfo, len, capacity)