Почему буфер используется в системном вызове Win32 API для преобразования в массив [1 << 20] <type>? - PullRequest
0 голосов
/ 15 мая 2018

Я пишу приложение 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.

1 Ответ

0 голосов
/ 16 мая 2018

Вам необходимо выбрать статический размер для типа массива, поэтому 1<<20 выбран достаточно большим, чтобы учесть любой разумный буфер, возвращаемый вызовом.

В этом размере нет ничего особенного,иногда вы увидите 1<<31-1, так как это самый большой массив для 32-битных платформ, или 1<<30, поскольку он выглядит лучше.Это действительно не имеет значения, если тип может содержать возвращаемые данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...