gpt4 book ai didi

golang 结构的另一个函数更改映射

转载 作者:IT王子 更新时间:2023-10-29 02:24:52 24 4
gpt4 key购买 nike

我是新来的。现在我有一个关于 functoin 传递变量的问题。这是代码:

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 --------
0xc04203a4c0
0xc04203a4d0
{Leto map[]}
in func --------
0xc04203a500
0xc04203a510
after --------
{Leto map[t:t]}

在 Modify func 中我知道 user 是一个副本,所以更改名称不起作用是可以的,但是为什么要将 Map effect 改出 user struct?

最佳答案

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

  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)

关于golang 结构的另一个函数更改映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40520099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com