@s60

Как ввернуть нескольких значений одной функцией в printf()?

1) Изучаю Golang, дошел до map
2) встретил конструкцию
value, ok := products["Hat"]
if (ok) {
fmt.Println("Stored value:", value)
} else {
fmt.Println("No stored value")
}


какой-то ok comma pattern/idioma

3) смотрим функции - они тоже могут возвращать несколько значений
4) пробуем запихнуть все это одним махом в printf()
fmt.Printf("Цена: %v , ok= %t\n", products["Hat"])
и получаем на выходе: "Цена: 48.95 , ok= %!t(MISSING)"

с функцией такая же беда:
func swap(x, y string) (string, string) {
	return y, x
}

fmt.Printf("Цена: %s , ok= %s\n", swap("1","2"))

и получаем "multiple-value swap("1", "2") (value of type (string, string)) in single-value context" ....

Вопрос: так как же работает это "вытягивание" нескольких переменных "под капотом" ?
Почему
value, ok := products["Hat"]
a, b := swap("hello", "world")

работает, а
fmt.Printf("Цена: %s , ok= %s\n", swap("1","2"))
нет ?
Казалось бы - swap()/map возвращает два значения вот и впихни их в первый %s и во второй %s, но нет ....

перефразирую вопрос: можно ли лаконично "раскидать" все значения, возвращаемые функцией/картой по плейсхолдерам printf() первое возвращаемое значение в первый, второе - во второй и т.д.?
  • Вопрос задан
  • 145 просмотров
Пригласить эксперта
Ответы на вопрос 2
@falconandy
Подсмотрел ответ тут - можно обернуть результат функции специальной функцией wrap:
func swap(x, y string) (string, string) {
	return y, x
}

func wrap(vs ...interface{}) []interface{} {
	return vs
}

func main() {
	fmt.Printf("Цена: %s , ok= %s\n", wrap(swap("1", "2"))...)
}
Ответ написан
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
Так как вы пробуете нельзя. Функции способные принять произвольное количество аргументов, на самом деле принимают один -- слайс. То, что элементы этого слайса можно привести перечислением -- синтаксический сахар.
Конструкция func1(func2()) работает только в случае если func2() возвращает ровно такие значения и столько, сколько аргументов ожидает func1().
В вашем случае swap() возвращает два значения, а fmt.Printf() ожидает только один аргумент -- []interface{}
То есть можно только вот так
func printTwoValue(x, y string) {
	fmt.Printf("Цена: %s , ok= %s\n", x, y)
}
printTwoValue(swap("1", "2"))

Работающий код https://go.dev/play/p/z9sFlujsfxd
Ну или вот так
func swap(x, y string) []interface{} {
	return []interface{}{y, x}
}
fmt.Printf("Цена: %s , ok= %s\n", swap("1", "2")...)

Работающий код
https://go.dev/play/p/46ylXp9Tirv
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы