Function 围棋之旅中的函数调用,练习“切片”
我正在学围棋,我试过围棋。我对这个话题本身毫无疑问。我很难理解函数调用 这是我对此练习的解决方案:Function 围棋之旅中的函数调用,练习“切片”,function,go,Function,Go,我正在学围棋,我试过围棋。我对这个话题本身毫无疑问。我很难理解函数调用 这是我对此练习的解决方案: 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]
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。所以我认为,正确的函数调用可能是Pic40,30,其中40和30是dx和dy的值
但是为什么第17行会抛出错误呢?图40,30
为什么18号线可以工作?pic.ShowPic
当执行第18行时,dx和dy的值来自哪里?
我试着去查,这会让我重新找到你。在这里我可以看到,函数show是这样定义的:
func Show(f func(int, int) [][]uint8)
我理解为:
Show是一个需要一个参数的函数。此参数是一个需要两个参数(均为int类型)的函数,并且它必须返回类型为[][]uint8的值—无符号8位整数的切片。Show本身不会返回任何内容
所以,在这里,我再次读到,内部函数Show的参数需要两个参数。但是,当我试图提供这些参数时,为什么会出现错误呢?为什么在没有参数的情况下调用函数Pic是可以的?当执行Pic时,这些参数的值从何而来?您的函数Pic接受两个参数,Show接受一个参数。您使用单个参数调用Show,该参数是一个函数;该函数具有两个参数。当您将一个函数传递给另一个函数时,假设您调用的函数Show将调用您在Pic中传递的函数,并在调用时提供必要的参数。您的函数Pic接受两个参数,Show接受一个参数。您使用单个参数调用Show,该参数是一个函数;该函数具有两个参数。当您将一个函数传递给另一个函数时,假设您正在调用的函数Show将调用您在Pic中传递的函数,并在调用时提供必要的参数。当您说Pic40时,30调用函数Pic,它将返回函数定义中所示的[][]uint8。这意味着您在注释掉的代码中传递了一个要显示的[][]uint8
当您说ShowPic时,您将Pic作为参数传递,这是一个函数。这正是该剧所期待的。Pic类型为funcdx,dy int[][]uint8
Go允许您将函数作为参数传递,这就是这里发生的情况。当您说Pic40,30时,您调用函数Pic,它返回一个[][]uint8,如函数定义中所示。这意味着您在注释掉的代码中传递了一个要显示的[][]uint8
当您说ShowPic时,您将Pic作为参数传递,这是一个函数。这正是该剧所期待的。Pic类型为funcdx,dy int[][]uint8
Go允许您将函数作为参数传递,这就是这里发生的事情。您对Show的定义非常正确-它是一个接受另一种特定格式概念作为参数的函数。 Pic就是这样一个符合这个标准的函数——所以你通过它来成功地显示
但是当你调用Pic30,40时,这意味着不是一个函数,而是用这些参数调用函数的结果。因此,在本例中,您传递的不是函数Pic,而是它返回的切片[][]uint8。当然,我们不能接受 关于Show的定义,您是完全正确的——它是一个接受另一种特定格式概念作为参数的函数。 Pic就是这样一个符合这个标准的函数——所以你通过它来成功地显示
但是当你调用Pic30,40时,这意味着不是一个函数,而是用这些参数调用函数的结果。因此,在本例中,您传递的不是函数Pic,而是它返回的切片[][]uint8。当然,我们不能接受 单击godoc.org上的标题,查看实现所记录内容的代码。Pic调用您传递给显示的函数。单击godoc.org上的标题,查看实现所记录内容的代码。Pic调用您传递给显示的函数。好的。但是dx和dy的值来自哪里呢?如何将自己的宽度和高度发送到此函数?Show的实现将调用您在内部提供的函数。你在这个例子中写的是Pic,它返回一张图片作为灰度值的2D数组。Show现在提供此图像生成器以显示其结果。Show将调用Pic,或者您传递给它的任何其他图像生成器函数,它知道如何显示Pic生成的灰色图像。名字就这样出现了,我现在知道了。这将在本教程的后面部分解释:我认为在练习中不使用模板是明智的,因为在这一点之前,模板是无法解释的。但是dx和dy的值来自哪里呢?如何将自己的宽度和高度发送到此函数?Show的实现将调用您提供的函数
它是内部的。你在这个例子中写的是Pic,它返回一张图片作为灰度值的2D数组。Show现在提供此图像生成器以显示其结果。Show将调用Pic,或者您传递给它的任何其他图像生成器函数,它知道如何显示Pic生成的灰色图像。名字就这样出现了,我现在知道了。这将在本教程的后面部分解释:我认为在练习中不使用模板是明智的,因为在这一点之前,模板是无法解释的。