【问题标题】:Log multiple returned values in Go在 Go 中记录多个返回值
【发布时间】:2014-07-30 18:30:46
【问题描述】:

是否有一种惯用的方法来记录返回多个值的函数的结果?这不会编译:

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 摘要(特别感谢@rvigacio):

这是 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 有一个 final ... 参数,则为其分配 g 的返回值,这些值在分配常规参数后仍然存在。 (http://golang.org/ref/spec#Calls)

【问题讨论】:

  • According to the spec, eatWithSpice("pepper", returnPair()) 不是不一致,应该是eatWithSpice("pepper", returnPair()...)
  • @rvigacio 不起作用:play.golang.org/p/fz-452hKT7
  • 对不起,我错过了你返回多个值,here's the correct explanation:“作为一种特殊情况,如果函数或方法 g 的返回参数数量相等并且可以单独分配给另一个参数函数或方法 f,则调用 f(g(parameters_of_g)) 将 g 的返回值按顺序绑定到 f 的参数后调用 f。不允许函数调用的其他特殊情况。 "

标签: logging go multiple-value


【解决方案1】:

您可以先分配这些返回值:

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

您可以在“Multiple return values from Go functions”中查看示例。

Println 中直接使用多个返回值是可行的(因为它接受variadic parameters):

在你的情况下: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

【讨论】:

  • 这正是我想要避免的
  • @grep 我添加了另一种方法:直接使用 Println
【解决方案2】:

我赞成 VonC 的方法,它更干净,但如果你真的想要,你可以从 Must() 类的函数中获得灵感,然后做这样的事情:

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()))
}

编辑:

或更通用的:

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()))
}

【讨论】:

  • 这看起来不错:fmt.Printf("returned %v", fmt.Sprint(returnPair()))
  • 大声笑,确实,要简单得多:p。不知道为什么我在第二个示例中调用了 displayPair ^^
猜你喜欢
  • 2017-02-07
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多