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,虽然传递的是数组,不是指针,但是在函数内是可以修改的,也就是并没有把数组复制一份传递到函数中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏