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,雖然傳遞的是數組,不是指針,但是在函數內是可以修改的,也就是並沒有把數組複製一份傳遞到函數中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章