Сгенерируйте с помощью gofmt, заменив значение переменной
Выпуск инструмента "Сгенерировать" открывает массу интересных возможностей. Я пытался сделать свои тесты лучше. У меня есть функция, которая запрашивает внешний API, местоположение этого API определяется в глобальной переменной. Одним из кусочков головоломки является замена этого значения значением, определенным во время генерации.
Я имею:
//go:generate gofmt -w -r "var apiUrl = a -> var apiUrl = \"http://example.com\"" $GOFILE
Запуск go генерирует, а затем выдает ошибки:
parsing pattern var apiUrl = a at 1:1: expected operand, found 'var'
Это не вариант использовать заполнитель, например, так:
gofmt -r 'API_GOES_HERE -> "http://example.com"' -w
Это потому, что когда я компилирую производственный код, исходный код переписывается, поэтому последующие компиляции для тестирования больше не могут заменить заполнитель (он уже был заменен).
Я понимаю, что злоупотребляю gofmt
несколько, но я бы не хотел возвращаться к sed
, Что будет действительным go:generate
заявление?
2 ответа
Вы можете использовать флаг компоновщика -X
для этого. Например,
go build -ldflags "-X main.APIURL 'http://example.com'"
будет строить вашу программу с APIURL
переменная установлена в http://example.com
,
Больше информации в документах компоновщика.
Редактирование Go 1.5: начиная с Go 1.5, рекомендуется использовать новый формат:
go build -ldflags "-X main.APIURL=http://example.com"
(Обратите внимание на знак равенства.)
В вашем тестовом файле говорят api_test.go
добавить команду создания, которая производит другой файл с именем api_endpoint_test.go
который находится в том же пакете и только определяет или вводит (используя init
функция) переменная вам нужна. Это значение переменной будет использоваться только во время тестирования.
Для справки, я не совсем понимаю, почему вы пытаетесь сделать это таким образом, вместо того, чтобы инициализировать переменную во время выполнения или использовать какой-то традиционный метод конфигурации.