Сгенерируйте с помощью 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 функция) переменная вам нужна. Это значение переменной будет использоваться только во время тестирования.


Для справки, я не совсем понимаю, почему вы пытаетесь сделать это таким образом, вместо того, чтобы инициализировать переменную во время выполнения или использовать какой-то традиционный метод конфигурации.

Другие вопросы по тегам