function - 去旅游 #18 : understanding pic. 秀

标签 function go

我不明白函数调用 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 的函数,它接收两个整数变量(dxdy)。所以我认为,正确的函数调用可能是 Pic(40,30)(4030dx 的值dy)。

  • 但为什么第 17 行会抛出错误? (pic.Show(Pic(40,30)))
  • 为什么第 18 行行得通? (pic.Show(Pic))
  • 执行第18行时,dxdy的值从何而来?

我试图查找 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 type int, 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/

相关文章:

list - Golang - 链接到 id 的套接字片段以进行通知

正则表达式匹配对我来说很奇怪

python - 无法合并两个已排序的单链表,因为 "type object ' _Node' 没有属性 '_element' "

C++函数声明

c++ - Cgal二次规划目标函数

Go 应用程序(在 Docker 容器中)没有反射(reflect)页面上的更改?

for-loop - For loop Increment with a step 不起作用

docker - 来自 Docker 的 Golang 编译缓存

function - 没有名为 'psycopg2._psycopg' 的模块

Python3 Argparse 尝试读取文件并计算字母