go中 for循环的坑
go中 for循环的坑
在使用for循环修改结构体切片中的值时,发现并没有修改成功。
type Dog struct {
name string
}
func (d *Dog) setNewName(name string) {
d.name = name
}
func main() {
d := Dog{
name: "123",
}
d1 := Dog{
name: "456",
}
d2 := Dog{
name: "789",
}
dogSlice := make([]Dog, 0)
dogSlice = append(dogSlice, d, d1, d2)
for _, dog := range dogSlice {
dog.setNewName("123")
}
for _, dog := range dogSlice {
fmt.Println(dog)
}
}
结果切片中dog的name并没有全部变为123,后来查资料才知道for循环中的dog其实是个变量,指向的并不是真正的dog。
打印其地址对比可以看出压根就不同。
for i, dog := range dogSlice {
fmt.Printf("dog地址:%p 切片中dog的真正地址:%p\n", &dog, &(dogSlice[i]))
}
dog地址:0x14000010230 切片中dog的真正地址:0x14000066180
dog地址:0x14000010230 切片中dog的真正地址:0x14000066190
dog地址:0x14000010230 切片中dog的真正地址:0x140000661a0
若要修改切片中的dog的name,应该按照以下这么写,或者将dogSlice变为存dog指针的切片,dogSlice := make([]*Dog, 0)
for i, _ := range dogSlice {
dogSlice[i].setNewName("123")
}
for _, v := range dogSlice {
fmt.Println(v)
}
打印如下:
{123}
{123}
{123}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!