Golang函数作为参数

时间:2019-08-21 04:09:08

标签: go

我遇到了以下代码,以生成给定字符串的排列。

package main

import (
    "fmt"
)

func main() {
    Perm([]rune("abc"), func(a []rune) {
        fmt.Println(string(a))
    })

}

func Perm(a []rune, f func([]rune)) {
    perm(a, f, 0)
}

func perm(a []rune, f func([]rune), i int) {
    if i > len(a) {
        f(a)
        return
    }
    perm(a, f, i+1)
    for j := i + 1; j < len(a); j++ {
        a[i], a[j] = a[j], a[i]
        perm(a, f, i+1)
        a[i], a[j] = a[j], a[i]
    }
}

我很难理解该程序的工作原理。特别是在func perm中调用f(a)的退出条件。有人可以解释f(a)的含义吗?

我尝试打印fmt.Println(f(a)),但出现错误。

去游乐场:https://play.golang.org/p/FNijVw32iAy

1 个答案:

答案 0 :(得分:1)

您发现了一个关闭!

Also known as an anonymous function.

基本上,它是一个一次性功能,不会超出其范围。

对于打印无效,部分原因是匿名性,部分原因是它没有打印返回值。如果您真的想进入它,可以尝试打印&f生成一个指针,以便您有一个值可以打印出来。