猿问

创建一个全局二维切片,长度为输入

我需要在输入中创建一个具有自定义长度的二维切片。切片是我的扫雷器的字段,所以长度将是字段的维度。我需要切片是全局的,现在我将切片直接初始化为字段的常量维度,但是我正在实现难度,所以我需要字段是可变的。


//my code right now

const dimX int = 16            //X field dimension

const dimY int = 16            //Y field dimension

var bombs int = 40             //number of mines

var number [dimX][dimY]int8    //number contained in the cell, 0 if empty, -1 if mine

var isOpen [dimX][dimY]bool    //if the cell is visible to the user

var isFlagged [dimX][dimY]bool //if the cell is marked as a bomb

有没有一种方法可以声明变量,然后在函数中初始化它们,就像这样(这种方式在 go 中是不可能的):


//what i'd like to do

var dimX, dimY, bombs int

var number [][]int8

    

func main() {

   Scan(&dimX, &dimY, &bombs)

   number = [dimX][dimY]

   ...

}

我也尝试过使用make,但它给了我一个不兼容的分配(不能使用make([][]uint8,dimX)([][]uint8类型的值)作为[16][16]int8):


func main() {

   Scan(&dimX, &dimY, &bombs)

   number = make([][]uint8, dimX)

   for i := range number {

      number[i] = make([]uint8, dimY)

   }

   ...

}

我发现唯一可行的方法是通过 append() 函数:将字段声明为 [][] 或 [0][0] 并在用户输入后运行一个函数 append() x 次和 y 次到切片


慕丝7291255
浏览 103回答 1
1回答

慕尼黑8549860

问题中的第一段代码使用数组数组。数组的长度在编译时设置。像第二段代码一样使用切片。切片的长度是动态的。如第三段代码所示,使用make分配切片。var dimX, dimY, bombs intvar number [][]int8  // empty [] is a slice.fmt.Scan(&dimX, &dimY, &bombs)number = make([][]int8, dimX)for i := range number {    number[i] = make([]int8, dimY)}注意:问题中的代码在引用元素时使用int8和。uint8这些是不同的类型。这个答案使用int8.在操场上运行示例。
随时随地看视频慕课网APP

相关分类

Go
我要回答