gpt4 book ai didi

go - 我不明白代码 : result = quote123(func(x int) string { return fmt. Sprintf ("%b", x) })

转载 作者:数据小太阳 更新时间:2023-10-29 03:47:33 26 4
gpt4 key购买 nike

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

对于 quote123 函数,它需要一个函数作为参数,如何将部分: func(x int) string { 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com