golang對數組的遍歷基本上有兩種,一種是根據索引,一種是使用range
使用range遍歷得到的是複製過的數據,並不是數組原來的數據,所以不能賦值修改數組
如果想修改數組,需要使用索引遍歷的方式
type STest struct {
A int
B int
}
// 使用range遍歷,無法修改
func ftest1(sts []STest) {
for _, v := range sts {
v.A = 1
v.B = 1
}
}
// 使用索引遍歷,可以修改
func ftest2(sts []STest) {
for i := range sts {
sts[i].A = 2
sts[i].B = 2
}
}
// 使用索引遍歷,可以修改
func ftest3(sts []STest) {
for i := 0; i < len(sts); i++ {
sts[i].A = 3
sts[i].B = 3
}
}
func main() {
var mtest []STest
mitem := STest{
A: 0,
B: 0,
}
mtest = append(mtest, mitem)
mtest = append(mtest, mitem)
for k, v := range mtest {
log.Println(k, v.A, v.B)
}
ftest1(mtest)
for k, v := range mtest {
log.Println(k, v.A, v.B)
}
ftest2(mtest)
for k, v := range mtest {
log.Println(k, v.A, v.B)
}
ftest3(mtest)
for k, v := range mtest {
log.Println(k, v.A, v.B)
}
}
0 0 0
1 0 0
0 0 0
1 0 0
0 2 2
1 2 2
0 3 3
1 3 3
從上面還有一個細節,可以看到golang,雖然傳遞的是數組,不是指針,但是在函數內是可以修改的,也就是並沒有把數組複製一份傳遞到函數中。