我正在学习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 "" })
}

最佳答案

quote123接受带有整数参数并返回字符串的任何函数。在此代码中传递给它的参数是带有此签名的函数文字,也称为附件或匿名函数。函数文字包括两个部分:
func(x int) string
这是功能文字的签名。这表明它与quote123接受的参数类型匹配,即convert类型,已定义为type convert func(int) string的命名类型
{ return fmt.Sprintf("%b", x) }
这是函数文字的主体或实现。这是调用函数文字时实际运行的代码。在这种情况下,它采用整数x,将其格式化为二进制格式(这就是%b格式化动词的作用),然后返回该字符串。
quote123将此函数作为参数,使用整数(在本例中为123整数)调用它,然后获取它返回的字符串并使用%q格式动词对其进行格式化,该动词将给定的字符串括在引号中。

最终的效果是传入123,格式为二进制(1111011),返回为字符串(1111011),然后再次使用周围的引号("1111011")进行格式化,然后最终将其输出到控制台。

接受这样的函数文字可以使您自定义调用函数时的行为。 quote123将始终返回带引号的字符串,但是其中的内容可以更改。例如,如果我改为给它以下文字:
func(x int) string { return fmt.Sprintf("%06d", x) }
我会取回字符串"000123",因为格式化动词%06d表示将其打印为宽度为6的整数,并用0代替空格字符。如果我改用:
func(x int) string { return "hello world" }
我总是会取回字符串"hello world",而不管它是用哪个整数调用的。

关于go - 我不懂代码:result = quote123(func(x int)string {return fmt.Sprintf(“%b”,x)}),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54354773/

10-12 23:35