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
Linda HamiltonOriginal
2024-12-04 22:44:11554browse

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

Output:

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

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!

Statement:
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
Previous article:Using CloudEvents in GoNext article:Using CloudEvents in Go