我正在学习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/