Я пишу приложение golang, которое взаимодействует с Windows Services с использованием пакета windows / svc .
Когда я смотрю на исходный код пакета, как выполняются системные вызовы, я вижу интересную приведенную конструкцию:
name := syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(s.ServiceName))[:]
Извлечено из mgr.go
Это обычный шаблон при работе с Win32 API, когда нужно передать предварительно выделенный буфер для получения значения из функции Win32 API, обычно массива или структуры.
Я понимаю, что Win API возвращает строку юникода, представленную указателем, и она передается в функцию syscall.UTF16ToString(s []uint16)
для преобразования ее в строку go в этом случае.
Я в замешательстве от части, когда небезопасный указатель приведен к указателю на массив 1M, *[1<<20]uint16
.
Почему размер, если 1M [1 << 20]? </p>
Буфер для значения выделяется динамически, а не с фиксированным размером 1M.