Я не знаю, почему вы считаете, что грязный . У вас есть одна переменная, и вы устанавливаете ее в нескольких init
функциях, поэтому параметр last остается тем, который остается установленным: ваше объяснение происходящего является правильным. Понятно, что на самом деле это две разные переменные, просто одна из них будет использоваться .
(Предполагается, что есть другие команды, которые делают другие вещи, возможно, нет Будет использоваться этих глобальных переменных. Если бы Go был языком c с естественной более динамичностью, в котором все определяется во время выполнения, или если вы использовали более динамически c Настройка во время выполнения, вы не могли бы создать ни одного из них, но это не Go: Go полон переменных stati c typing и stati c, созданных во время соединения.)
Если вы действительно хотите использовать только одну глобальную переменную, тем не менее, очевидное решение состоит в том, чтобы выбрать какое-то значение часового, чтобы оно означало , а не установить , и сделать это значение по умолчанию, которое устанавливает Cobra. Затем, если переменная содержит значение «не установлено» при запуске команды, вы знаете, что пользователь не предоставил значение.
Если пустая строка подходит в качестве такого стража - обычно это так - это это просто. Каждая из ваших команд получает несколько строк:
if deviceUUID == "" {
deviceUUID = defaultDeviceUUID
}
и все готово.
Это может быть приятно или, по крайней мере, более удобно для вас, если код кобры сохранен значения инициализатора по умолчанию где-то private , когда вы сделали:
configCmd.Flags().StringVar(&deviceUUID, "deviceUUID", "configDeviceUUID", "Device UUID")
, а затем скопировали эти приватные, сохраненные значения по умолчанию в (одну) глобальную переменную , когда команда верхнего уровня решила, что подкоманду config
следует использовать вместо того, чтобы не сохранять ее где-то в частном порядке и копировать ее в (единственную) глобальную переменную в в то время функция configCmd.Flags().StringVar()
называется , но на самом деле это не так. Итак:
configCmd.Flags().StringVar(&deviceUUID, "deviceUUID", "", "Device UUID")
плюс приведенных выше тестов с пустыми строками может быть достаточно. Обратите внимание, что каждый init
все еще перезаписывает глобальную переменную (одну, общую и, возможно, даже никогда не используемую) каждый раз, но все они устанавливают ее из начального значения пустой строки в новое значение пустой строки , оставив его без изменений.