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

posted @ 2024-01-17 10:22  秋来叶黄  阅读(155)  评论(0编辑  收藏  举报