[英]Why is a buffer used in Win32 API syscall cast to [1<<20]<type> array?
我正在編寫一個golang應用程序,該應用程序使用windows / svc軟件包與Windows Services進行交互。
當我查看程序包源代碼時,如何完成syscall時,我看到了有趣的強制轉換構造:
name := syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(s.ServiceName))[:]
摘自mgr.go
當處理Win32 API時需要傳遞一個預分配的緩沖區以從Win32 API函數(通常是數組或結構)接收值時,這是一種常見的模式。
我知道Win API返回一個由其指針表示的unicode字符串,並將其傳遞給syscall.UTF16ToString(s []uint16)
函數,以在這種情況下將其轉換為go字符串。
當不安全的指針強制轉換為指向1M數組*[1<<20]uint16
的指針時,我感到困惑。
為什么尺寸為1M [1 << 20]?
一個值的緩沖區是動態分配的,而不是固定大小為1M。
您需要為數組類型選擇靜態大小,因此將1<<20
選擇為足夠大以允許調用返回的任何合理緩沖區。
這個大小沒有什么特別的,有時您會看到1<<31-1
因為它是32位平台上最大的陣列,或者1<<30
因為它看起來更好。 只要類型可以包含返回的數據,實際上就沒有關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.