Home >Backend Development >Golang >How to Remove Elements from a Slice Within a Struct in Go?

How to Remove Elements from a Slice Within a Struct in Go?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-14 16:29:02503browse

How to Remove Elements from a Slice Within a Struct in Go?

Removing Elements from a Slice Within a Struct

In Go, structs are aggregates of fields, which can include slices. When a method attempts to modify the receiver (i.e., the struct itself), it must use a pointer receiver to update the original value rather than creating a copy.

Consider the following code:

type Guest struct {
    id      int
    name    string
    surname string
    friends []int
}

func (self Guest) removeFriend(id int) {
    for i, other := range self.friends {
        if other == id {
            self.friends = append(self.friends[:i], self.friends[i+1:]...)
            break
        }
    }
}

This code removes an element from the "friends" slice within the "Guest" struct. However, attempting to remove an element from the original struct results in overwriting the desired element and multiplying the last element, as seen in the example:

guest1.friends = [1, 2, 3, 4, 5]
guest1.removeFriend(3)
// Result: guest1.friends = [1, 2, 4, 5, 5]

To rectify this issue, you must use a pointer receiver:

func (self *Guest) removeFriend(id int) {
    // ... (Same implementation)
}

By using a pointer receiver, you assign the new slice value (returned by "append()") to the "friends" field of the original "Guest" struct, effectively reducing the slice length by 1.

Additionally, it's recommended to use a more idiomatic receiver name, such as "guest" or "g," instead of "self."

The above is the detailed content of How to Remove Elements from a Slice Within a Struct in Go?. 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