Зарегистрируйте несколько возвращаемых значений в Go

StackOverflow https://stackoverflow.com//questions/25044309

  •  21-12-2019
  •  | 
  •  

Вопрос

Есть ли идиоматический способ записать результат функции, возвращающей несколько значений?Это не скомпилируется:

import "log"
func returnPair() (int,int) {
    return 42, 24
}
func main() {
    log.Printf("Returned %v", returnPair())
}

prog.go:7: multiple-value returnPair() in single-value context

Краткое изложение UPD (особая благодарность @rvignacio):

Это особенность синтаксиса Go:

func eat(args ...interface{}) {}

func eatWithSpice(spice string, args ...interface{}) {}

func main() {
    eat(returnPair()) // this works
    eatWithSpice("pepper", returnPair()) // this does not
}

В частном случае, если возвращаемые значения функции или метода g равны по количеству и индивидуально присваиваются параметрам другой функции или метода f, то вызов f(g(parameters_of_g)) вызовет f после привязки возвращаемых значений. g к параметрам f по порядку.Вызов f не должен содержать никаких параметров, кроме вызова g, и g должен иметь хотя бы одно возвращаемое значение.Если f имеет финал...параметру ему присваиваются возвращаемые значения g, которые остаются после назначения обычных параметров. (http://golang.org/ref/spec#Calls)

Это было полезно?

Решение

Вы можете сначала назначить эти возвращаемые значения:

a, b := returnPair()
log.Printf("Returned %d %d", a, b

Вы можете увидеть пример в "Несколько возвращаемых значений из функций Go".

Использование множественного возвращаемого значения непосредственно в Println хотя работает (поскольку он принимает вариативные параметры):

В твоем случае: play.golang.org

package main

import "log"

func returnPair() (a int, b int) {
    return 42, 24
}
func main() {
    log.Println(returnPair())
}

Выход:

2009/11/10 23:00:00 42 24

Другие советы

I aprrove the method of VonC, which is cleaner, but if you really want, you can get inspired by the Must() kind of function and do something like this:

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

package main

import "fmt"

func returnPair() (int, int) {
    return 42, 24
}

func displayPair(a, b interface{}) string {
    return fmt.Sprint(a, b)
}

func main() {
    fmt.Printf("pair: %v\n", displayPair(returnPair()))
}

EDIT:

Or more generic:

http://play.golang.org/p/DjPur-aatt

package main

import "fmt"

func returnPair() (int, int) {
    return 42, 24
}

func returnTriple() (int, int, int) {
    return 42, 24, 10
}

func displayPair(elem ...interface{}) string {
    return fmt.Sprint(elem...)
}

func main() {
    fmt.Printf("pair: %v, triple %v\n", displayPair(returnPair()), displayPair(returnTriple()))
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top