如何将一个多返回值的函数做为另一个函数的参数?

试写以下一行代码并运行:

fmt.Println(string(json.Marshal(…)))

报错 “ multiple-value json.Marshal() in single-value context”

原因是json.Marshal(…)会返回两个值。然后不得不分开写:

result, _ := json.Marshal(…)
fmt.Println(string(result))

运行成功。

我的问题是,有没有什么方便的办法直接写成一行?

共 4 个回复


stevewang

如果json.Marshal失败,你打算怎么处理呢?

# 0

leedstyh

如果你是在每次Println的时候都嫌check err麻烦,可以写一个帮助函数:

func Print(b []byte, err error) {
    if err != nil {
        fmt.Println("Marshal error:", err.Error())
    } else {
        fmt.Println(string(b))
    }
}

func main() {
    Print(json.Marshal(map[string]string{"key":"val"}))
}
# 1

qq19116699

package main

func main() {
    println(add(func() (int, int) {
        return 1, 2
    }()))
}

func add(a, b int) int {
    return a + b
}
# 2

tangramgis

感谢大伙的回复~ :D

更多是站在纯研究golang语言的角度去思考哈~

以前有接触过lua和js的多返回值做为参数,然后突发其想就冒出这个问题了,而且觉得是有些用处的~

也是知道要有检测err的习惯。然尔,有时候只是加入一些临时调试代码的时候,又想要偷懒了~

对于错误检测,比方说就算是除0也会报错,俺着不住每做一次除法就要检查一遍除数表达式是否为0,在已经知道自己的逻辑除非是hack而否则不可能为0的情况下~(回想以前做java时就是为了安全,然后遍地的try…catch…)

看来还是要写点辅助函数~ 0_0

# 3