处理Go和Windows API中的未大小数组

问题描述 投票:1回答:2

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

编译器无法根据每个事件的可用属性数量来重新确定数组的大小,因此我最终得到了一个数组项。

你对如何处理这种边缘情况有什么明智的想法吗?

提前致谢

windows go winapi etw
2个回答
0
投票

所以你想在Go中使用可变大小的数组?用一片?

EventPropertyInfoArray [1]EventPropertyInfo

将会

EventPropertyInfoArray [1]EventPropertyInfo

如果你粗略地了解了它可以保持的最大值,你就可以使用make这样的东西制作一个数组,但是这不会帮助你声明一个结构:

EventPropertyInfoArray []EventPropertyInfo

0
投票

经过大量的反复试验,我设法通过标准技术从支持阵列中获取正确的切片,将数组转换为切片:

EventPropertyInfoArray = make([]EventPropertyInfo, len, capacity)
© www.soinside.com 2019 - 2024. All rights reserved.