從結構體中的切片中刪除元素(已解決)
在提供的程式碼片段中,嘗試刪除使用值接收器從結構內的切片中取得元素。這會導致原始結構體中切片的錯誤修改。
要解決此問題,必須在修改切片的方法中使用指標接收器。這是因為 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中文網其他相關文章!