Использование неэкспортированных функций / типов из stdlib в Go - PullRequest
0 голосов
/ 17 февраля 2019

Отказ от ответственности: да, я знаю, что это не «должно быть сделано», а «использовать составление интерфейса и делегирование» и «авторы языка знают лучше».Однако я сталкиваюсь с выбором: либо вставить копию из стандартной библиотеки, либо создать свои собственные пакеты, либо выполнить то, что я прошу.Поэтому, пожалуйста, не отвечайте: «То, что вы хотите сделать, неправильно, вы плохой разработчик и вам должно быть плохо».

Итак, в Go у нас есть пакет http stdlib.Этот пакет имеет ряд функций для работы с заголовками и ответами HTTP Range (парсеры, структура для "offset + size" и т. Д.).По разным причинам я хочу использовать что-то, что очень похоже на ServeContent, но работает немного по-другому (короче говоря, количество сантехники, необходимое для выполнения гимнастики ReaderAt, неоптимально для того, чего я хочу достичь), поэтому я хочусамостоятельно проанализировать заголовок HTTP Range, используя служебные функции / структуры из пакета http stdlib, а затем обработать их вручную.По сути, я хочу изменить версию ServeContent: -)

Можно ли мне как-то «открыть» пакет http stdlib, чтобы использовать его неэкспортированные идентификаторы?ABI не беспокоит меня, так как исходный код мой, программа каждый раз компилируется с нуля и т. Д. И т. Д., И ей не требуется двоичная совместимость со старыми / другими версиями Go.Т.е. я могу гарантировать, что сборка будет выполняться на определенной версии Go, и есть тесты, чтобы проверить, что не экспортированный идентификатор исчез.Итак ...

Если в стандартной библиотеке Go есть пакет с именем foo, но он предоставляет только MagicMegamethod, который делает то, что мне не нужно, и использует usefulFunc и usefulStruct что я хочу получить доступ, есть ли способ получить доступ к этим идентификаторам?Либо путем повторного открытия пакета, либо другим способом ... который не включает в себя копирование десятков строк из stdlib без тестов и т. Д.

1 Ответ

0 голосов
/ 18 февраля 2019

Существуют ( довольно ужасные ) способы доступа к неэкспортированным символам, но для этого требуется нетривиальное количество хитрого кода, поэтому вряд ли будет чистый выигрыш.

Поскольку вы отсталиНаправление «не делай этого», кажется, что ответ либо НЕТ, либо используй методы, описанные в посте, на который я ссылаюсь ( и это репо ).

FWIW I 'Я бы просто скопировал нужный мне код из стандартной библиотеки и подстроил его под свои нужды.Скорее всего, это займет меньше времени, чем у вас, чтобы написать этот ТАК вопрос: -)

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