Ответ 1
Возможно, но строка формата должна быть изменена, вы должны использовать явный аргумент:
Явные индексы аргументов:
В Printf, Sprintf и Fprintf по умолчанию используется для каждого глагола форматирования для форматирования последовательных аргументов, переданных в вызове. Тем не менее, нотация [n] непосредственно перед глаголом указывает, что n-й одноиндексный аргумент должен быть отформатирован. То же обозначение перед '*' для ширины или точности выбирает индекс аргумента, содержащий значение. После обработки выражения в скобках [n] последующие глаголы будут использовать аргументы n + 1, n + 2 и т.д., Если не указано иное.
Ваш пример:
val := "foo"
s := fmt.Sprintf("%[1]v in %[1]v is %[1]v", val)
fmt.Println(s)
Выход (попробуйте на Go Playground):
foo in foo is foo
Конечно, приведенный выше пример можно просто написать в одной строке:
fmt.Printf("%[1]v in %[1]v is %[1]v", "foo")
Также как небольшое упрощение, первый индекс явного аргумента может быть опущен, поскольку по умолчанию он равен 1
:
fmt.Printf("%v in %[1]v is %[1]v", "foo")