2 回答

TA貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊
主要問題是您嘗試分配。使用您的代碼檢查我的示例;https://play.golang.org/p/lwoe79jQ70
您實際上從后一種實現(xiàn)中得到的是一個 3x0 數(shù)組,所有內(nèi)部數(shù)組都是空的。這樣做的原因是因為您正在使用范圍變量進(jìn)行分配,這是行不通的。如果當(dāng)前索引是0
, y != pic[0]
,pic[0]
分配給y
但是,y
是臨時存儲,它通常是相同的地址并且在每次迭代時被覆蓋。所以在后一個例子執(zhí)行之后,你所有的 x 方向數(shù)組都是空的,索引到一個會導(dǎo)致恐慌。
基本上你應(yīng)該只使用你的第一個實現(xiàn),因為它工作正常并且是你通常會這樣做的方式。但是要點是,當(dāng)您這樣做時a, b := range Something
b != Something[a]
,它是在實例上,它超出了循環(huán)底部的范圍,并且分配給它不會導(dǎo)致集合的狀態(tài)更改,相反,如果您愿意,Something
您必須分配給Something[a]
修改Something[a]
.

TA貢獻(xiàn)1803條經(jīng)驗 獲得超6個贊
range 從您正在迭代的切片中復(fù)制值。
見: http: //golang.org/ref/spec#RangeClause
要澄清發(fā)生了什么,請參見這個簡單的代碼示例及其輸出:
package main
import "fmt"
func main() {
s := "hi"
//s[0] = 'H' // cannot assign to s[0]
for _, v := range s {
fmt.Printf("%T, %[1]v, %X\n", v, &v)
v = 'H' // has no effect: this is local var not ref
}
fmt.Println(s)
}
輸出為:
int32, 104, C0820042D4
int32, 105, C0820042D4
hi
如您所見,變量 v 的地址沒有改變(C0820042D4),v 是局部變量,范圍將值復(fù)制到其中,因此更改 v 無效。這里 v 是 rune(int32 別名),rune 是一個標(biāo)識 Unicode 代碼點的整數(shù)值,你不能分配給 s[0] 并且這不會編譯: s[0] = 'H'
所以 v = 'H ' 對 s 沒有影響,它只是局部變量。
- 2 回答
- 0 關(guān)注
- 197 瀏覽
添加回答
舉報