去命名参数

Ale*_*Bar 13 reflection go python-3.x

如何将字典作为函数的参数列表传递,如在Go 3中的Python 3中?

Python 3:

def bar(a,b,c):
    print(a,b,c)

args={c: 1, b: 2, a: 3}
bar(**args)
Run Code Online (Sandbox Code Playgroud)

空白:

func bar( a, b, c int) {
    fmt.Printf("%d, %d, %d", a, b, c)
}

func main(){
    args := make(map[string]int)
    args["a"] = 3
    args["b"] = 2
    args["c"] = 1
    // what next ?
}
Run Code Online (Sandbox Code Playgroud)

dsk*_*ner 19

我不相信这是可能的.你需要使用一个结构来做任何事情,甚至远程接近这个(它是一个遥远的相似)

type Args struct {
    A, B, C int
}

func bar(args *Args) {
    fmt.Printf("%d, %d, %d", args.A, args.B, args.C)
}

func main() {
    args := new(Args)
    args.A = 3
    args.B = 2
    args.C = 1
    bar(args)
}
Run Code Online (Sandbox Code Playgroud)

  • 你不需要那样调用它,使用`bar(&Args {B:2})`工作. (3认同)
  • 是的,当然,我这样称呼它是为了保持与给定示例的视觉相似性,无论其价值如何。 (2认同)
  • 同样值得注意的是,由于这个答案得到了一些投票,这个问题立刻促使我想到了必须处理变量args的net/rpc包,所以从中可以得出答案.看看标准库如何做事情往往是一些关于Go的最佳建议,请参阅:http://golang.org/pkg/net/rpc/ (2认同)

Lin*_*ope 11

除了我认为不需要重复的其他答案之外,请注意Go将使用提供的多个返回参数自动解包函数调用:

  1. 每个返回值都是函数的参数
  2. 每个参数都是函数的返回值

(也就是说,函数的参数列表的类型与其他函数的返回列表相同).

func Args() (a int, b int, c int) {
    return 1,2,3
}

func Bar(a,b,c int) {
    fmt.Println(a,b,c)
}

func main() {
    Bar(Args())
}
Run Code Online (Sandbox Code Playgroud)

会打印1,2,3.显然这个例子有点傻,但我发现这涵盖了大多数tuple和dict解包作为Python中的参数的情况,这往往是将一个函数的返回值作为另一个函数的参数传递的快速而肮脏的方式.

  • 真棒,这是我认为我不知道的那些案例之一,我没有意识到你可以将这些解压缩的值直接传递给另一个函数. (4认同)