> 백엔드 개발 > Golang > Go 구조체의 슬라이스에 추가하려면 포인터 수신기가 필요한 이유는 무엇입니까?

Go 구조체의 슬라이스에 추가하려면 포인터 수신기가 필요한 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-27 17:39:12
원래의
256명이 탐색했습니다.

Why Do I Need a Pointer Receiver to Append to a Slice in a Go Struct?

Go 구조체의 슬라이스 속성에 추가

Go 구조체 내의 슬라이스 속성에 값을 추가하려고 하면 예기치 않은 동작이 발생할 수 있습니다. 특정 호출 순서를 따르지 않는 경우. 이 문서에서는 이 문제의 원인을 살펴보고 해결 방법을 제공합니다.

제공된 코드 예제에서는 문제를 보여주기 위해 서로 다른 구조체 유형 내에 세 가지 메서드가 정의되어 있습니다. Test1 및 Test2는 run() 메서드가 슬라이스 속성에서 직접 작동하기 때문에 예상대로 작동합니다. 그러나 Test3에서는 포인터 수신기 대신 값 수신기를 사용하여 run()에서 콤보() 메서드를 호출합니다.

포인터 수신기가 필요한 이유

Go에서는 모든 값이 값별로 전달됩니다. 즉, 함수나 메서드를 호출할 때 전달된 값의 복사본이 생성됩니다. Test3의 경우, 콤보()가 호출될 때 Test3 값의 복사본이 만들어지며, 이 복사본의 슬라이스 속성에 대한 수정 사항은 원본 Test3 구조체에 반영되지 않습니다.

포인터 수신기를 사용하여 , func (c *Test3) 콤보()와 같이 원래 Test3 구조체가 직접 수정되어 로컬 복사 문제가 제거됩니다.

해결책

해결책은 콤보() 메소드의 수신 유형을 포인터 수신으로 변경하는 것입니다. 이렇게 하면 원본 Test3 구조체가 메서드에 의해 수정됩니다.

업데이트된 코드

package main

import (
  "fmt"
)

type Test1 struct {
  all []int
}

func (c Test1) run() []int {
  for i := 0; i < 2; i++ {
    c.all = append(c.all, i)
  }
  return c.all
}

var gloabl_all []int

type Test2 struct {}

func (c Test2) run() []int {
  c.combo()
  return gloabl_all
}

func (c Test2) combo() {
  for i := 0; i < 2; i++ {
    gloabl_all = append(gloabl_all, i)
  }
}

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() {
  test1 := &Test1{}
  fmt.Println("Test1 final:", test1.run())

  test2 := &Test2{}
  fmt.Println("Test2 final:", test2.run())

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

출력

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

위 내용은 Go 구조체의 슬라이스에 추가하려면 포인터 수신기가 필요한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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