初学 golang,小白求解惑!

2021-11-25 17:13:01 +08:00
 superfatboy
package main

import "fmt"

type Test struct {
	Id   int64
	Name string
}

func main() {
	var list = []Test{
		Test{Id: 1, Name: "1XX"},
		Test{Id: 2, Name: "2XX"},
		Test{Id: 3, Name: "3XX"},
	}
	for _, v := range list {
		v.Name = "888"
	}
        fmt.Println(list)
}

为啥修改 Name 貌似没生效

4148 次点击
所在节点    Go 编程语言
27 条回复
mmuggle
2021-11-26 09:31:04 +08:00
代码其实相当于下面这种
```
package main

import "fmt"

type Test struct {
Id int64
Name string
}

func main() {
var list = []Test{
Test{Id: 1, Name: "1XX"},
Test{Id: 2, Name: "2XX"},
Test{Id: 3, Name: "3XX"},
}
v := Test{}
for _, v = range list {
v.Name = "888"
}
fmt.Println(list)
}
```
superfatboy
2021-11-26 09:46:55 +08:00
@mmuggle 你这种写法就容易理解了
Mitt
2021-11-26 11:30:28 +08:00
@SimbaPeng #17 一个意思的两种表达而已,虽然你说的是对的,但你显然误解了上面所说的拷贝,在我看来两种说法都没有问题
whyso
2021-11-26 11:50:48 +08:00
@SimbaPeng 真相了,LZ 的问题在于 V 而不是 range ,循环修改值我一般用 for i:=0; i<len();i++ {}这种,不修改用 range
SimbaPeng
2021-11-26 12:23:38 +08:00
@Mitt 在我看来你所谓的“两种表达”,描述的本质是不同,楼上有些回复的本意是:range 会 产生迭代对象的副本,所以无法修改原对象。事实是 range 确实会产生 迭代对象的副本,但这不是 LZ 不能用 v 来修改原对象中元素的原因。

有的甚至扯到深浅拷贝,认为 range 产生了深拷贝,但其实 range 只会 产生 切片结构的拷贝,底层引用的数组还是同一个。
oluoluo
2021-11-26 15:12:11 +08:00
```
package main

import "fmt"

type Item struct {
Id uint64
Name string
}

func main() {
list := []Item{
{Id: 1, Name: "1xxx"},
{Id: 2, Name: "2xxx"},
{Id: 3, Name: "3xxx"},
}
for i := 0; i < len(list); i++ {
fmt.Printf("item %d address: %p\n", i, &list[i])
}
for _, v := range list {
v.Name = "888"
fmt.Printf("list item address: %p\n", &v)
}
fmt.Println("---------------")
fmt.Println(list)
}
```
item 0 address: 0x14000060050
item 1 address: 0x14000060068
item 2 address: 0x14000060080
list item address: 0x1400000c030
list item address: 0x1400000c030
list item address: 0x1400000c030
---------------
[{1 1xxx} {2 2xxx} {3 3xxx}]
wangritian
2021-11-26 18:11:17 +08:00
想修改内容时,我都会这样写:
for i := range list {
v := &(list[i])
v.Name = "xxx"
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/817965

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX