为了账号安全,请及时绑定邮箱和手机立即绑定

golang 结构的另一个 func 更改图

golang 结构的另一个 func 更改图

Go
慕容708150 2022-04-20 17:29:30
我是一个新人。现在我有一个关于函数传递变量的问题。这里是代码:type User struct {    Name string    Map  map[string]string}func main() {    u := User{Name: "Leto"}    u.Map = make(map[string]string)    fmt.Println("before --------")    fmt.Println(unsafe.Pointer(&u))    fmt.Println(unsafe.Pointer(&(u.Map)))    fmt.Println(u)    Modify(u)    fmt.Println("after --------")    fmt.Println(u)}func Modify(u User) {    fmt.Println("in func --------")    fmt.Println(unsafe.Pointer(&u))    fmt.Println(unsafe.Pointer(&(u.Map)))    u.Name = "Paul"    u.Map["t"] = "t"}输出上面的代码:before --------0xc04203a4c00xc04203a4d0{Leto map[]}in func --------0xc04203a5000xc04203a510after --------{Leto map[t:t]}在修改功能中我知道用户是一个副本,所以更改名称不起作用是可以的,但是为什么将地图效果更改为用户结构?
查看完整描述

3 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

我们需要了解在每次调用中内存分配是如何工作的:


  u := User{Name: "Leto"}

// u is an object of type User

// after this line memory has been allocated to both the

// properties u.Name(string) and u.Map(reference)

// lets say allocated memory address for u.Name starts with x

// for u.Map it starts with y, and note that u.Map is a reference i.e. 

// the value contained in it will be a different memory address which

// will be the starting memory address of the actual map

// right now the value written at y is nil since it 

// does not point to any memory address

u.Map = make(map[string]string)

// now value of y has been updated to z (which is the 

// memory address of the beginning of the map initialized 

// with make call) 

fmt.Println("before --------")

fmt.Println(unsafe.Pointer(&u))

fmt.Println(unsafe.Pointer(&(u.Map)))

fmt.Println(u)

// here you are about to pass object by value 

// so basically a new object will be created of type User

// lets talk about how copy of this object will be created

// copy of u.Name will have a new address 

// lets call it x1 and the value "Leto" too will be 

// copied to memory address starting with x1

// copy of u.Map will have a new address too lets call it 

// y1 and its value z will be copied too to the memory address y1

// I think you must have got your answer by now. 

// Basically the newly copied object's property u.Map and 

// the old one's u.Map both points to the same memory address "z" 

// and hence whosoever updates the map the other one will see it

Modify(u)

fmt.Println("after --------")

fmt.Println(u)


查看完整回答
反对 回复 2022-04-20
?
长风秋雁

TA贡献1757条经验 获得超7个赞

您应该在分配和修改操作中分别使用 &User 和 *User。

检查这个https://play.golang.org/p/tDh1JBpK-t

使用指向结构的指针总是更好。


查看完整回答
反对 回复 2022-04-20
?
慕容森

TA贡献1853条经验 获得超18个赞

切片、贴图和通道是参考类型。所以它们总是通过引用传递。



查看完整回答
反对 回复 2022-04-20
  • 3 回答
  • 0 关注
  • 239 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号