>백엔드 개발 >Golang >Go 구조체 설정자가 원래 구조체를 수정하기 위해 포인터가 필요한 이유는 무엇입니까?

Go 구조체 설정자가 원래 구조체를 수정하기 위해 포인터가 필요한 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-16 04:22:12388검색

Why Do Go Struct Setters Need Pointers to Modify the Original Struct?

구조체 설정기 사용: 포인터의 중요성 이해

Go에서 구조체로 작업할 때 설정기를 사용하면 구조체의 속성을 수정할 수 있습니다. 그러나 원하는 수정 사항이 예상대로 반영되지 않는 경우가 있을 수 있습니다. 이는 구조체가 함수에 전달되는 방식 때문입니다.

제공된 예제 코드에서:

type T struct { Val string }

func (t T) SetVal(s string) {
    t.Val = s
}

func (t *T) SetVal2(s string) {
    (*t).Val = s
}

제공된 SetVal 함수는 원래 구조체를 예상대로 수정하지 않습니다. 구조체는 함수에 값으로 전달됩니다. 이 복사본에 대한 수정 사항은 원본 구조체에 영향을 미치지 않습니다.

또는 SetVal2 함수는 구조체에 대한 포인터를 기대하여 원본 구조체를 수정할 수 있습니다. 이는 Go가 구조체에 대한 포인터를 값으로 전달하기 때문입니다. 즉, 함수는 원래 구조체와 동일한 메모리 위치에 대한 참조를 수신합니다.

이 동작을 시연하려면 다음 코드를 고려하세요.

v := T{"abc"}
fmt.Println(v)        // {abc}
v.SetVal("pdq")
fmt.Println(v)        // {abc}
v.SetVal2("xyz")
fmt.Println(v)        // {xyz}

이 예에서 원래 구조체 v는 SetVal에 의해 수정되지 않지만 SetVal2에 의해 수정됩니다. 이는 출력의 차이로 명백히 드러납니다.

Go에서 중요한 점은 Go에서 구조체에 대해 setter를 사용할 때 값 전달과 포인터 전달의 차이를 이해하는 것이 중요하다는 것입니다. 포인터를 사용하면 함수가 원래 구조체를 수정할 수 있으며, 값을 전달하면 함수 내에 구조체의 복사본이 생성됩니다.

위 내용은 Go 구조체 설정자가 원래 구조체를 수정하기 위해 포인터가 필요한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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