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

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

问题描述:

Recently, I've been interested in machine learning more specifically, machine learning with images, but to do that, I need to be able to process images. I want to have a more thorough understanding of how image processing libraries work along the way, so I have decided to make my own library for reading images that I can understand. However, I seem to have an issue when it comes to reading the SIZE of an image, as this error pops up when I try to compile:

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

This is my code:

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() {


}

I'm just beginning programming with Go, so I'm sorry if this question sounds nooby

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

  ./imageProcessing.go:33:11:非恒定数组绑定大小
  code>  pre> 
 
 

这是我的代码: p>

   package main 
 
import(
 //“ fmt” 
 //“ os” 
)
 
 //此函数读取要使用的图像尺寸,如readImageDimension(“ IMAGENAME  .PNG“,” HEIGHT“)
 
 func readImageDimension(路径字符串,该字符串)int {
 
var Dimensionsyes int 
 
if(which ==”“ ||其中==”“){
 恐慌(“您尚未输入要拥有的尺寸。”)
}如果((==“高度” ||其中==“高度” ||其中==“高度” ||其中==“  h“ ||其中==” H“){
 // TODO:插入用于读取图像高度的代码
 
返回尺寸是
 
}否则,如果(其中==”宽度“ ||其中 ==“ WIDTH” ||其中==“宽度” ||其中==“ w” ||其中==“ W”){
 // TODO:插入用于读取图像宽度的代码
 
  RET  urn Dimensionsyes 
 
}其他{
恐慌(“无法识别尺寸类型。”)
} 
} 
 
 func addImage(路径字符串,图像字符串,Height int,Width int){
 var 大小int 
大小=宽度*高度
 var Pix [大小] [3] int 
} 
 
func main(){
 
 
} 
  code>  pre> 
  
 

我才刚开始使用Go进行编程,因此,如果这个问题听起来很笨拙,我感到抱歉 p> div>

Because Go is a statically typed language, which means types of variables need to be known at compile-time.

Arrays in Go are fixed sizes: once you create an array in Go, you can't change its size later on. This is so to an extent that the length of an array is part of the array type (this means the types [2]int and [3]int are 2 distinct types).

The value of a variable is generally not known at compile-time, so using that as the array length, the type would not be known at compile time, hence it is not allowed.

Read related questions: How do I find the size of the array in go

If you don't know the size at compile time, use slices instead of arrays (there are other reasons to use slices too).

For example this code:

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

Can be transformed to create and use a slice like this:

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