我需要創建一個具有自定義長度的二維切片,在輸入中獲取。切片是我的掃雷艇的領域,所以長度將是領域的維度。我需要切片是全域的,現在我將切片直接初始化為欄位的共同維度,但我正在實作困難,所以我需要該欄位是可變的。
//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 次附加到切片
uj5u.com熱心網友回復:
問題中的第一段代碼使用了一個陣列陣列。陣列的長度在編譯時設定。
在第二段代碼中使用切片。切片的長度是動態的。
如第三段代碼所示,使用make分配切片。
var dimX, dimY, bombs int
var 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.
在操場上運行示例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/334889.html
標籤:走
