golang 结构体数组遍历赋值设置
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,虽然传递的是数组,不是指针,但是在函数内是可以修改的,也就是并没有把数组复制一份传递到函数中。