我不懂代码:result = quote123(func(x int)string {return fmt.Sprintf(“%b”,x)})

时间:2019-01-24 20:24:15

标签: go

我正在学习golang,对于将一个函数作为另一个函数的参数传递的代码,我不知道列出的代码的含义

对于quote123函数,它将函数作为参数,如何将部分:func(x int)字符串{return fmt.Sprintf(“%b”,x)}传递给quote123函数,即使那样可以,如果该部分返回一个字符串,则该字符串不应该是函数quote123的参数。

// convert types take an int and return a string value.
type convert func(int) string

// value implements convert, returning x as string.
func value(x int) string {
    return fmt.Sprintf("%v", x)
}

// quote123 passes 123 to convert func and returns quoted string.
func quote123(fn convert) string {
    return fmt.Sprintf("%q", fn(123))
}

func main() {
    var result string

    result = value(123)
    fmt.Println(result)
    // Output: 123

    result = quote123(value)
    fmt.Println(result)
    // Output: "123"

    result = quote123(func(x int) string { return fmt.Sprintf("%b", x) })
    fmt.Println(result)
    // Output: "1111011"

    foo := func(x int) string { return "foo" }
    result = quote123(foo)
    fmt.Println(result)
    // Output: "foo"

    _ = convert(foo) // confirm foo satisfies convert at runtime
    // fails due to argument type
    // _ = convert(func(x float64) string { return "" })
}

1 个答案:

答案 0 :(得分:1)

quote123接受任何带有整数参数并返回字符串的函数。在此代码中传递给它的参数是带有此签名的函数文字,也称为附件或匿名函数。函数文字包括两个部分:

func(x int) string

这是功能文字的签名。这表明您与quote123所采用的参数类型相匹配,即类型convert,命名类型定义为type convert func(int) string

{ return fmt.Sprintf("%b", x) }

这是函数文字的主体或实现。这是调用函数文字时实际运行的代码。在这种情况下,它使用整数x,将其格式化为二进制形式(即%b格式化动词的形式)作为字符串,然后返回该字符串。

quote123将此函数作为参数,使用整数(在本例中为整数123)对其进行调用,然后获取其返回的字符串并使用{{1}对其进行格式化}格式动词,用引号将给定的字符串引起来。

传入的净效果是123,以二进制(%q)格式,以字符串(1111011返回,然后再次以引号(1111011)格式然后最终将其打印到控制台。

接受这样的函数文字可让您自定义调用函数时的行为。 "1111011"将始终返回带引号的字符串,但是其中的内容可以更改。例如,如果我改为给它以下文字:

quote123

我将返回字符串func(x int) string { return fmt.Sprintf("%06d", x) },因为格式动词"000123"表示将其打印为宽度为6的整数,并用0代替空格字符。如果我改用:

%06d

无论调用哪个整数,我总是会返回字符串func(x int) string { return "hello world" }