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