>백엔드 개발 >Golang >Go 구조체 메서드에서 슬라이스에 추가하는 것이 항상 작동하지 않는 이유는 무엇입니까?

Go 구조체 메서드에서 슬라이스에 추가하는 것이 항상 작동하지 않는 이유는 무엇입니까?

DDD
DDD원래의
2025-01-03 10:15:39519검색

Why Doesn't Appending to a Slice in a Go Struct Method Always Work?

Go에서 슬라이스 조작 이해

Go에서는 슬라이스를 구조체의 속성으로 조작할 때 값 전달을 고려하는 것이 중요합니다. 특정 상황에서는 메서드 내의 슬라이스에 추가하는 것이 실패하는 것처럼 보일 수 있습니다. 이에 대한 이유를 알아보고 해결책을 찾아보겠습니다.

Go 구조체의 값 전달

Go에서는 모든 것이 값으로 전달됩니다. 즉, 복사본이 생성됩니다. 전달된 각 값에 대해. 결과적으로 메서드 내의 복사본에 대한 수정 사항은 원래 값에 영향을 주지 않습니다.

Test3: 실패한 추가 시도

다음 코드를 고려하세요.

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)
  }
}

Test3.run()을 호출하면 c.all이 수정되지 않은 것으로 나타납니다. 이는 콤보() 메서드가 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)
  }
}

다음을 사용하여 포인터 수신기를 사용하는 경우 콤보()가 원래 Test3 값을 수정하고 메서드가 반환될 때 변경 사항이 반영되는지 확인하세요.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.