Golang多值函数组合

huangapple go评论70阅读模式
英文:

Golang multiple-value function composition

问题

我明白了,以下是翻译的内容:

在我在SO上没有找到答案的一个简短问题:当内部函数有多个返回值时,如何编写复合函数调用?

子问题:是否可以仅对多值函数的一个返回值进行类型转换,而不使用临时变量?

示例:http://play.golang.org/p/intnxkzSO1

package main

import "fmt"

func multiReturn() (int, int) {
    return 0, 1
}

func noOp(a int) int {
    return a
}

func main() {

    // 参数过多
    fmt.Print(noOp(multiReturn()))

    // 多值在单值上下文中
    fmt.Print(string(multiReturn()))
}
英文:

Short question to which I haven't found an answer on SO: how do I write composite function calls when an inner function has multiple return values?

Sub-question: can you cast just one of the returns from a multiple-value function without using a temp variable?

Example: http://play.golang.org/p/intnxkzSO1

package main

import "fmt"

func multiReturn() (int, int) {
	return 0, 1
}

func noOp(a int) int {
	return a
}

func main() {

	// Too many arguments
	fmt.Print(noOp(multiReturn()))

	// multiple-value in single-value context
	fmt.Print(string(multiReturn()))
}

答案1

得分: 2

你可以使外部函数的返回值与内部函数的返回值匹配。

func multiReturn() (int, int) {
    return 10, 1
}

func noOp(a, _ int) int {
    return a
}

func main() {
    fmt.Printf("%v\n", noOp(multiReturn()))             // 输出: 10
    fmt.Printf("%s", strconv.Itoa(noOp(multiReturn()))) // 输出: 10
}

另外,需要注意的是,string(int) 不起作用,你需要使用 strconv 包。

在这里可以尝试运行代码:play

另一种选择是使用可变参数

func noOp(a ...int) int {
    if len(a) > 0 {
        return a[0]
    }
    return 0
}
英文:

You can have your outer function match the return values of the inner function

func multiReturn() (int, int) {
    return 10, 1
}

func noOp(a, _ int) int {
    return a
}

func main() {
    fmt.Printf("%v\n", noOp(multiReturn()))             // output: 10
    fmt.Printf("%s", strconv.Itoa(noOp(multiReturn()))) // output: 10
}

On a side note string(int) will not work, you have to use the strconv package.

Go play

Another option would to use a variadic parameter.

func noOp(a ...int) int {
    if len(a) > 0 {
        return a[0]
    }
    return 0
}

答案2

得分: 0

例如,

package main

import "fmt"

func singleReturn() int {
    s, _ := multiReturn()
    return s
}

func multiReturn() (int, int) {
    return 0, 1
}

func noOp(a int) int {
    return a
}

func main() {

    fmt.Print(noOp(singleReturn()))
    fmt.Print(string(singleReturn()))

    // 参数过多
    //fmt.Print(noOp(multiReturn()))

    // 多值在单值上下文中
    //fmt.Print(string(multiReturn()))
}
英文:

For example,

package main

import "fmt"

func singleReturn() int {
	s, _ := multiReturn()
	return s
}

func multiReturn() (int, int) {
	return 0, 1
}

func noOp(a int) int {
	return a
}

func main() {

	fmt.Print(noOp(singleReturn()))
	fmt.Print(string(singleReturn()))

	// Too many arguments
	//fmt.Print(noOp(multiReturn()))

	// multiple-value in single-value context
	//fmt.Print(string(multiReturn()))
}

答案3

得分: -3

你也可以返回一个返回多个值的函数。

func f() (int, int) {
    return 1, 2
}

func g() (int, int) {
    return f()
}
英文:

you can also return a function that returns multiple values.

func f() (int, int) {
    return 1, 2
}

func g() (int, int) {
    return f()
}

huangapple
  • 本文由 发表于 2014年11月2日 03:31:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/26692327.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定