>  기사  >  백엔드 개발  >  값 수신기를 사용하면 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으로 문의하세요.