구조체 설정기 사용: 포인터의 중요성 이해
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!