구조체의 슬라이스에서 요소 제거(해결됨)
제공된 코드 조각에서 제거를 시도할 때 문제가 있습니다. 값 수신기를 사용하여 구조체 내의 슬라이스에서 요소를 가져옵니다. 이로 인해 원본 구조체의 슬라이스가 잘못 수정됩니다.
이 문제를 해결하려면 슬라이스를 수정하는 메서드에 포인터 수신기를 사용해야 합니다. 이는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!