golang 结构的另一个 func 更改图

我是一个新人。现在我有一个关于函数传递变量的问题。这里是代码:


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]}

在修改功能中我知道用户是一个副本,所以更改名称不起作用是可以的,但是为什么将地图效果更改为用户结构?


慕容708150
浏览 240回答 3
3回答

杨魅力

我们需要了解在每次调用中内存分配是如何工作的:  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 addressu.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 itModify(u)fmt.Println("after --------")fmt.Println(u)

长风秋雁

您应该在分配和修改操作中分别使用 &User 和 *User。检查这个https://play.golang.org/p/tDh1JBpK-t使用指向结构的指针总是更好。

慕容森

切片、贴图和通道是参考类型。所以它们总是通过引用传递。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go