当前位置: 首页 > 面试题库 >

为什么不能在Go中将变量作为多维数组大小放置?

农鸿达
2023-03-14
问题内容

最近,我一直对机器学习感兴趣,尤其是对图像的机器学习,但是要做到这一点,我需要能够处理图像。我想对图像处理库在此过程中的工作方式有更全面的了解,因此我决定创建自己的库来读取我能理解的图像。但是,在读取图像的
大小 时似乎遇到了一个问题,因为在尝试编译时会弹出此错误:

 ./imageProcessing.go:33:11: non-constant array bound Size

这是我的代码:

package main

import (
 // "fmt"
 // "os"
)

// This function reads a dimension of an image you would use it like readImageDimension("IMAGENAME.PNG", "HEIGHT")

 func readImageDimension(path string, which string) int{

var dimensionyes int

if(which == "" || which == " "){
    panic ("You have not entered which dimension you want to have.")
} else if (which == "Height" || which == "HEIGHT" || which == "height" || which == "h" || which =="H"){
    //TODO: Insert code for reading the Height of the image

    return dimensionyes

} else if (which == "Width" || which == "WIDTH" || which == "width" || which == "w" || which =="W"){
    //TODO: Insert code for reading the Width of the image

    return dimensionyes

} else {
    panic("Dimension type not recognized.")
    }
 }

 func addImage(path string, image string, Height int, Width int){
    var Size int
    Size = Width * Height
    var Pix [Size][3]int
 }

func main() {


}

我刚刚开始使用Go进行编程,所以很抱歉,如果这个问题听起来不行,


问题答案:

因为Go是一种静态类型的语言,这意味着需要在编译时知道变量的类型。

Go中的数组是固定大小的:在Go中创建数组后,以后就无法更改其大小。这是这样一种程度,即一个阵列的长度是阵列类型的一部分(这意味着类型[2]int[3]int2层不同的类型)。

通常在编译时不知道变量的值,因此使用该变量的值作为数组长度,在编译时将不知道类型,因此不允许使用。

如果您在编译时不知道大小,请使用切片而不是数组(还有其他原因使用切片)。

例如此代码:

func addImage(path string, image string, Height int, Width int){
    var Size int
    Size = Width * Height
    var Pix [Size][3]int
    // use Pix
}

可以转换为创建和使用像这样的切片:

func addImage(path string, image string, Height int, Width int){
    var Size int
    Size = Width * Height
    var Pix = make([][3]int, Size)
    // use Pix
}


 类似资料:
  • 问题内容: 我决定使用Swift的case语句和元组。它看起来像是该语言的较酷功能之一。 我决定玩月/日/年元组。令我惊讶的是,我不能在switch语句中使用常量元组值作为案例。这是一个示例(可以粘贴到Playground中并运行) 注释掉的代码不会编译(如果重要的话,在Xcode 6.3中)。在下面的情况下(我分别列出了joesBirthday元组的所有元素)更难键入且更难阅读,确实可以工作)

  • 问题内容: 我正在尝试将固定大小的数组转换为可变大小的数组(切片): 但是编译器抛出错误: 我应该如何转换? 问题答案: 使用让您在阵列上切片。另请参阅此博客文章,以获取有关数组和切片的更多信息。

  • 我已经阅读了这个问题的一些答案(为什么我不能创建大尺寸的数组https://bugs.openjdk.java.net/browse/JDK-8029587)我不理解以下内容。“在GC代码中,我们将对象的大小以单词的形式传递为int。”据我所知,JVM中单词的大小为4字节。根据这一点,如果我们将单词中的大尺寸长数组(例如MAX_INT-5)的大小作为INT传递,我们必须获得OutOfMemoryE

  • 我刚刚注意到,C#中的多维数组没有实现,而它实现了。对于单维数组,同时实现和。 为什么会有这种差别?如果多维数组是,那么它是否也应该实现泛型版本?我注意到这一点,是因为我试图在多维数组上使用扩展方法,除非您使用或类似的方法,否则会失败;所以我可以肯定地看到使多维数组实现的一个参数。 为了在代码中澄清我的问题,我希望下面的代码打印四次,而它实际打印的是、、、、和:

  • 问题内容: 这些变量分配按预期工作: 但是,这些分配的行为不同: 为什么与示例不同,为什么相同?我如何在类示例中做类似的事情?也就是说,复制对象,然后更改它的一部分(那不会影响我借用属性的对象)吗? 问题答案: 我没有看到有人通过复制对象而不是仅仅为同一对象分配新的引用来提供有关如何使这两种情况相同的详细信息。 这将为您提供:

  • 问题内容: 我了解Go中数组和切片之间的区别。但是我不明白的是为什么完全拥有数组会有所帮助。数组类型定义指定长度和元素类型为什么有帮助?为什么我们使用的每个“数组”都不能切片? 问题答案: 数组不仅仅是固定长度,还有更多:它们是 可比较的 ,并且它们是 值 (不是引用或指针类型)。 在某些情况下,数组比切片有无数的优势,所有这些优点加在一起证明了数组的存在(以及切片)。让我们看看他们。(我什至不算