> 백엔드 개발 > Golang > 포인터 수신기를 사용하지 않는 한 Golang 구조체 메서드 내에서 슬라이스에 추가하는 것이 작동하지 않는 이유는 무엇입니까?

포인터 수신기를 사용하지 않는 한 Golang 구조체 메서드 내에서 슬라이스에 추가하는 것이 작동하지 않는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-31 15:09:10
원래의
471명이 탐색했습니다.

Why doesn't appending to a slice within a Golang struct method work unless a pointer receiver is used?

왜 Golang에서 구조체의 속성인 슬라이스에 추가할 수 없나요?

Golang에서는 모든 것이 값으로 전달됩니다. , 즉 객체가 함수에 인수로 전달될 때마다 객체의 복사본이 생성된다는 의미입니다. 이로 인해 구조체의 속성인 슬라이스에 추가하려고 할 때 예기치 않은 동작이 발생할 수 있습니다.

문제: Test3

다음 예를 고려하세요.

package main

import "fmt"

type Test3 struct {
    all []int
}

func (c Test3) run() []int {
    c.combo()
    return c.all
}

func (c Test3) combo() {
    for i := 0; i < 2; i++ {
        c.all = append(c.all, i)
        fmt.Println("Test3 step", i+1, c.all)
    }
}

func main() {
    test3 := &Test3{}
    fmt.Println("Test3 final:", test3.run())
}
로그인 후 복사

test3.run()을 호출하면 test3의 복사본이 생성되어 실행되도록 전달됩니다. 그런 다음 run 메소드는 c.all에 두 개의 값을 추가하는 콤보를 호출합니다. 그러나 실행이 반환되면 test3의 복사본이 삭제되므로 c.all에 대한 변경 사항이 손실됩니다. 결과적으로 출력에 표시된 대로 빈 슬라이스가 반환됩니다.

Test3 step 1 [0]
Test3 step 2 [0 1]
Test3 final: []
로그인 후 복사

해결책: 포인터 수신기 사용

이 문제를 해결하려면 다음이 필요합니다. 콤보 방법에 포인터 수신기를 사용합니다. 이는 컴파일러에게 복사본 대신 Test3 값에 대한 포인터를 전달하도록 지시합니다.

func (c *Test3) combo() {
    for i := 0; i < 2; i++ {
        c.all = append(c.all, i)
        fmt.Println("Test3 step", i+1, c.all)
    }
}
로그인 후 복사

포인터 수신기를 사용하면 콤보의 c.all에 대한 변경 사항이 원래 Test3 값에 직접 적용됩니다. 참조로 전달되고 있습니다. 그러면 올바른 출력이 발생합니다.

Test3 step 1 [0]
Test3 step 2 [0 1]
Test3 final: [0 1]
로그인 후 복사

값 전달 개념을 이해하고 포인터 수신기를 적절하게 사용하면 Golang 구조체에서 슬라이스로 작업할 때 예기치 않은 동작을 방지할 수 있습니다.

위 내용은 포인터 수신기를 사용하지 않는 한 Golang 구조체 메서드 내에서 슬라이스에 추가하는 것이 작동하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿