首頁  >  文章  >  後端開發  >  為什麼使用值接收器會導致 Go 結構體中的切片修改不正確?

為什麼使用值接收器會導致 Go 結構體中的切片修改不正確?

Patricia Arquette
Patricia Arquette原創
2024-11-17 05:03:03971瀏覽

Why Does Using a Value Receiver Lead to Incorrect Slice Modification in a Go Struct?

從結構體中的切片中刪除元素(已解決)

在提供的程式碼片段中,嘗試刪除使用值接收器從結構內的切片中取得元素。這會導致原始結構體中切片的錯誤修改。

要解決此問題,必須在修改切片的方法中使用指標接收器。這是因為 Go 值接收器會建立接收器值的副本,這表示方法中對接收器所做的任何變更都不會反映在原始結構中。

以下是更正後的程式碼:

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

透過使用指標接收器 (*Guest),該方法修改原始 Guest 結構體的友元切片,確保元素被正確刪除。

說明:

當按值傳遞切片時,接收器方法對切片的副本進行操作。對切片進行修改時,它們僅反映在副本中,而不反映在原始切片中。但是,使用指標接收器允許該方法修改原始切片,因為接收器現在是指向原始結構的指標。

用法範例:

guest := &Guest{
    id:      1,
    name:    "Bob",
    surname: "Pats",
    friends: []int{1, 2, 3, 4, 5},
}

fmt.Println(guest)
guest.removeFriend(3)
fmt.Println(guest)

輸出:

&{1 Bob Pats [1 2 3 4 5]}
&{1 Bob Pats [1 2 4 5]}

以上是為什麼使用值接收器會導致 Go 結構體中的切片修改不正確?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn