Home > Backend Development > Golang > Why Do Go Slice Range Loops Create Shared Addresses When Mapping Structs?

Why Do Go Slice Range Loops Create Shared Addresses When Mapping Structs?

Linda Hamilton
Release: 2024-12-04 22:44:11
Original
560 people have browsed it

Why Do Go Slice Range Loops Create Shared Addresses When Mapping Structs?

Understanding the Go Slice Range Phenomenon

Problem: The Mysterious Slice Range Behavior

In Go, slices are a powerful data structure that can be iterated over using the range keyword. However, in a peculiar phenomenon, when iterating over a slice of structs using a for-range, the elements in the resulting map share the same address. This behavior can be confusing, especially since the elements in the original slice should have unique addresses.

Explanation: The Gotcha of Local Variables

The key to understanding this phenomenon lies in the way variables are stored in memory. When accessing an element of the slice within the for-range loop (stu in this case), the local variable stu is holding a copy of the struct. Assigning the pointer to the local variable effectively points all the elements in the map to the same copy of the struct in memory.

Resolving the Issue: Passing Slice Element Addresses

To resolve this issue and assign the addresses of the slice elements, the code must be modified to take the address of the slice element itself. By using s[i] instead of stu, the pointer to the actual element in the slice is assigned to the map.

Example: Demonstrating the Solution

package main

import "fmt"

type student struct {
    Name string
    Age  int
}

func main() {
    m := make(map[string]*student)
    s := []student{
        {Name: "Allen", Age: 24},
        {Name: "Tom", Age: 23},
    }

    for i := range s {
        m[s[i].Name] = &s[i] // Change here
    }
    fmt.Println(m)
    for key, value := range m {
        fmt.Println(key, value)
    }
}
Copy after login

Output:

map[Allen:0xc0000a6058 Tom:0xc0000a6060]
Allen &{Allen 24}
Tom &{Tom 23}
Copy after login

Conclusion

By understanding the underlying memory management behavior, we can address this slice range phenomenon in Go. By taking the address of the slice element itself, we ensure that each element in the map points to a unique struct in memory, maintaining data integrity.

The above is the detailed content of Why Do Go Slice Range Loops Create Shared Addresses When Mapping Structs?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template