我有一個矩陣陣列,我嘗試改變每個矩陣,以防 if 陳述句為真。例如,如果我有這個矩陣:
1 2 3
4 5 6
7 8 9
我想將每個奇數更改為 0。這就是我所擁有的:
func main() {
matrices := createMatrix() <-- returns an array of matrices.
for _, matrix := range matrices {
removeOdds(matrix)
}
}
func removeOdds(mat [][]int) {
for i := 0; i < len(mat); i {
for j := 0; j < len(mat[i]); j {
if mat[i][j] % 2 != 0 {
mat[i][j] = 0
}
}
}
}
這不起作用,因為矩陣沒有被改變。我讀到 Go 通過值而不是參考傳遞陣列,所以我嘗試使用指標。但是,當我在 removeOdds 更改后列印矩陣時,我得到了原始矩陣。
這是我寫的:
func main() {
matrices := createMatrix() <-- returns an array of matrices.
for _, matrix := range matrices {
removeOdds(&matrix)
}
}
func removeOdds(mat *[][]int) {
for i := 0; i < len(*mat); i {
for j := 0; j < len((*mat)[i]); j {
if (*mat)[i][j] % 2 != 0 {
(*mat)[i][j] = 0
}
}
}
}
uj5u.com熱心網友回復:
就我而言,代碼片段看起來完全沒問題。
需要明確的是,type[]int不是陣列,而是切片。陣列是一個固定長度的資料塊,陣列的型別簽名應該是這樣的[3]int。Slice 是一種參考型別,是對真實資料的可變長度視圖,這意味著它不擁有資料,它只記錄在其值中在記憶體中的何處找到資料。
當您將切片傳遞給函式時,該參考值被復制,即使在函式內部,您仍然參考同一個資料塊,或者您可以說底層陣列,就像在函式作用域之外一樣。
然而,我已經嘗試過自己的代碼,我寫了這個:
type Mat = [][]int
func makeMat() Mat {
return [][]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
}
}
func main() {
mats := []Mat{}
for i := 0; i < 10; i {
mats = append(mats, makeMat())
}
for _, mat := range mats {
// no change was made to this function
removeOdds(mat)
}
for _, mat := range mats {
fmt.Println(mat)
}
}
輸出:
[[0 2 0] [4 0 6] [0 8 0]]
[[0 2 0] [4 0 6] [0 8 0]]
[[0 2 0] [4 0 6] [0 8 0]]
[[0 2 0] [4 0 6] [0 8 0]]
[[0 2 0] [4 0 6] [0 8 0]]
[[0 2 0] [4 0 6] [0 8 0]]
[[0 2 0] [4 0 6] [0 8 0]]
[[0 2 0] [4 0 6] [0 8 0]]
[[0 2 0] [4 0 6] [0 8 0]]
[[0 2 0] [4 0 6] [0 8 0]]
所以我認為你的觀察可能存在一些錯誤。也許提供有關您的createMatrix().
uj5u.com熱心網友回復:
除了迭代矩陣之外,您的第一種方法是正確的。你應該使用
for i := range matrices {
removeOdds(matrix[i])
}
代替
for _, matrix := range matrices {
removeOdds(matrix)
}
https://go.dev/play/p/iE0uCE_6Z2v
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/373110.html
標籤:走
上一篇:無法使用go-git和訪問令牌運行httpsgitclone
下一篇:Go:負WaitGroup計數器
