>백엔드 개발 >Golang >내 Go 구조체 설정기 함수가 원래 구조체를 수정하지 않는 이유는 무엇입니까?

내 Go 구조체 설정기 함수가 원래 구조체를 수정하지 않는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-21 10:00:17700검색

Why Doesn't My Go Struct Setter Function Modify the Original Struct?

구조체 유형에 대한 Setter 이해

Go에서는 setter 함수를 통해 구조체를 수정할 수 있습니다. 그러나 구조체 유형에 대해 setter를 사용할 때 특정 동작은 예상하지 못할 수 있습니다. 다음 예를 고려하십시오.

package main

import "fmt"

type T struct { Val string }

// this setter seems not to work
func (t T) SetVal(s string) {
    t.Val = s
}

// this setter, using ptr to T, seems to work ok
func (t *T) SetVal2(s string) {
    (*t).Val = s
}

func main() {
    v := T{"abc"}
    fmt.Println(v)        // prints {abc}
    v.SetVal("pdq")
    fmt.Println(v)        // prints {abc}, was expecting {pdq}!
    v.SetVal2("xyz")
    fmt.Println(v)        // prints {xyz}!
}

SetVal 함수가 원래 구조체를 예상대로 수정하지 않는 이유는 무엇입니까?

값 의미 이해

라는 질문이 생깁니다.

주요 차이점은 구조체가 함수에 전달되는 방식에 있습니다. SetVal에서와 같이 구조체를 값으로 전달하면 함수 내에서 구조체의 복사본이 생성됩니다. 함수 내에서 변경된 사항은 이 임시 복사본에만 영향을 미치며 원본 구조체는 변경되지 않습니다.

그러나 포인터로 구조체를 전달할 때(SetVal2에서와 같이) 함수는 메모리의 원본 구조체에 액세스할 수 있습니다. 함수 내에서 이루어진 모든 변경 사항은 원래 구조체에 직접 반영됩니다.

가치 증명 의미

이는 관련된 구조체의 메모리 주소를 인쇄하여 설명할 수 있습니다. :

package main

import "fmt"

type T struct { Val string }

func (t T) SetVal(s string) {
    fmt.Printf("Address of copy is %p\n", &t)
}

func (t *T) SetVal2(s string) {
    fmt.Printf("Pointer argument is %p\n", t)
}

func main() {
    v := T{"abc"}
    fmt.Printf("Address of v is %p\n", &v)
    v.SetVal("pdq")
    v.SetVal2("xyz")
}

이 코드는 출력을 생성합니다. resembling:

Address of v is 0xf840001290
Address of copy is 0xf8400013e0
Pointer argument is 0xf840001290

인쇄된 첫 번째와 세 번째 주소가 동일하므로 동일한 구조체를 참조한다는 것을 나타냅니다. 그러나 두 번째 주소는 SetVal 내에서 생성된 임시 복사본을 나타내므로 다릅니다.

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

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