왜 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!