Pointers 为什么Win32 API系统调用中使用的缓冲区强制转换为[1<;<;20]<;类型>;阵列?

Pointers 为什么Win32 API系统调用中使用的缓冲区强制转换为[1<;<;20]<;类型>;阵列?,pointers,winapi,go,Pointers,Winapi,Go,我正在编写一个golang应用程序,它使用包与用户交互 当我查看包源代码时,我看到了有趣的cast构造: name := syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(s.ServiceName))[:] name:=syscall.UTF16ToString((*[1您需要为数组类型选择一个静态大小,因此1@BenVoigt你说得对,我的意思是1MB(1024KB),而不是1kbok,所以重点是,您将指针投射到静态

我正在编写一个golang应用程序,它使用包与用户交互

当我查看包源代码时,我看到了有趣的cast构造:

name := syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(s.ServiceName))[:]

name:=syscall.UTF16ToString((*[1您需要为数组类型选择一个静态大小,因此
1@BenVoigt你说得对,我的意思是1MB(1024KB),而不是1kbok,所以重点是,您将指针投射到静态数组,然后创建它的切片。但是,示例中的切片与数组具有相同的大长度,因此底层代码必须知道如何找到实际长度,在本例中为
syscall。UTF16ToString
搜索零,然后将切片重新切片到正确的长度。Right?@vlasta:是的,当你使用他的模式时,你必须像对待C中的数组一样对待切片,而不是计算长度。如果当时知道长度,你通常会立即看到长度和容量设置,以便可以安全地将其用作常规切片。