есть ли способ перечислить используемые переменные?

Скажем, у меня есть базовый текст / шаблон go:

{{.var}} is another {{.var2}}

Я хочу получить массив имен переменных, используемых в шаблоне, чтобы иметь возможность пропустить выполнение, если они недоступны в данных, которые я передаю для выполнения, возможно ли это как-то сделать?

Поскольку мои данные - это не структура, а карта, выполнение .var всегда будет возвращать что-то: если оно не существует, оно вернет пустую строку, когда я надеялся получить ошибку при выполнении шаблона.

Итак, для примера, приведенного выше, я бы хотел получить:

[var var2]

person Julien Fouilhé    schedule 17.02.2015    source источник
comment
Немного непонятно, о чем вы спрашиваете, вы хотите спросить, как вы можете проверить, было ли что-то нулевым? Или, скорее, как пройти по карте по паре (ключ, значение)?   -  person ttacon    schedule 17.02.2015
comment
@ user114241 Нет, я спрашиваю, есть ли способ получить список переменных, используемых в шаблоне go, перед выполнением.   -  person Julien Fouilhé    schedule 17.02.2015
comment
Я имею в виду, что единственные переменные, доступные в тексте / шаблоне, - это те, которые вы передаете, когда _1 _... Извините, может быть, я просто еще не выпил достаточно кофе сегодня днем.   -  person ttacon    schedule 17.02.2015
comment
@ user114241 нет Это я не могу объяснить, чего я хочу. Я хочу получить имена переменных, используемых в шаблоне, без необходимости изменять что-либо в шаблоне. Но ничего страшного, я сделал это другим способом, который я объясню в ответе позже. В любом случае спасибо   -  person Julien Fouilhé    schedule 17.02.2015
comment
@ user114241 Я объяснил немного больше в вопросе, надеюсь, это немного более понятно.   -  person Julien Fouilhé    schedule 17.02.2015
comment
Ах, кк, честно говоря, я бы сохранил строку [], содержащую имена переменных, установленных на вашей карте. Затем в шаблоне вы можете выбрать строку [] и использовать значение для индексации на вашей карте. Если вы хотите, чтобы шаблон вообще не компилировался, но если переменные не заданы, вы можете посмотреть soy и его реализация robfig / soy (шаблоны могут не компилироваться, если @params в соевых документах не предусмотрены / не установлены).   -  person ttacon    schedule 17.02.2015


Ответы (1)


Используйте функцию шаблона, которая возвращает ошибку, если значение не установлено. Что-то вроде этого:

template.FuncMap(map[string]interface{}{
    "require": func(val interface{}) (interface{}, error) {
        if val == nil {
            return nil, errors.New("Required value not set.")
        }
        return val, nil
    },
}))

Затем в вашем шаблоне:

{{require .Value}}

http://play.golang.org/p/qZMBID7Y8L

person Trevor Dixon    schedule 22.02.2015
comment
Да, я забыл ответить на свой вопрос, но на самом деле это то, что я сделал, поскольку то, что я хотел сделать, кажется невозможным! Спасибо! - person Julien Fouilhé; 22.02.2015