我不明白函数调用 pic.Show(Pic)
的工作原理以及它的作用。
package main
import "golang.org/x/tour/pic"
func Pic(dx, dy int) [][]uint8 {
pic := make([][]uint8, dy)
for y := range pic {
pic[y] = make([]uint8, dx)
for x := range pic[y] {
pic[y][x] = uint8(5 * (x + y))
}
}
return pic
}
func main() {
//pic.Show(Pic(40,30)) // doesn't work, but why?
pic.Show(Pic) // works, but why? Where are the values for dx and dy set?
}
从第 5 行开始,有一个名为 Pic
的函数,它接收两个整数变量(dx
、dy
)。所以我认为,正确的函数调用可能是 Pic(40,30)
(40
和 30
是 dx 的值
和 dy
)。
- 但为什么第 17 行会抛出错误? (
pic.Show(Pic(40,30))
) - 为什么第 18 行行得通? (
pic.Show(Pic)
) - 执行第18行时,
dx
和dy
的值从何而来?
我试图查找 http://golang.org/x/tour/pic将我重定向到 https://godoc.org/golang.org/x/tour/pic .我可以看到,函数 Show
是这样定义的:
func Show(f func(int, int) [][]uint8)
我的理解是:
Show
is a function that needs one parameter. This parameter is a function that needs two parameters, both of typeint
, and it has to return a value of type[][]uint8
(a slice of slices of unsigned 8-bit integers).Show
itself doesn't return anything.
所以,在这里,我又读到内部函数(Show
的参数)需要两个参数。但是,当我尝试提供这些参数时,为什么会出现错误?为什么可以不带参数调用函数Pic?当执行 Pic 时,这些参数的值从何而来?
最佳答案
当你说 Pic(40, 30)
时,你调用函数 Pic
并且它返回一个 [][]uint8
(如上所示在函数定义中)。这意味着在您注释掉的代码中,您将 [][]uint8
传递给 Show
。
当您说 Show(Pic)
时,您将 Pic
作为参数传递,这是一个函数。这就是 Show
所期望的。 Pic
的类型为 func(dx, dy int) [][]uint8
。
Go 允许您将函数作为参数传递,这就是这里发生的事情。
关于function - 去旅游 #18 : understanding pic. 秀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46935796/