Go에서 참조로 전달: 실용적인 가이드
Min-jun Kim
Dev Intern · Leapcell

Key Takeaways
- Go는 값에 의한 전달 방식을 사용하지만, 포인터를 통해 참조와 유사한 동작을 구현할 수 있습니다.
- 원본 값을 수정해야 하는 경우 포인터를 사용하십시오.
- 구조체 및 대용량 데이터 타입은 성능 향상을 위해 포인터 사용이 유리합니다.
Go(Golang)는 정적 타입의 컴파일 프로그래밍 언어로, 단순성과 성능으로 알려져 있습니다. 종종 새로운 사용자를 혼란스럽게 하는 개념 중 하나는 Go가 함수 인수를 처리하는 방식입니다. 특히 데이터를 참조로 전달할 때 그렇습니다.
이 기사에서는 Go에서 "참조에 의한 전달"이 무엇을 의미하는지, 작동 방식은 무엇인지, 그리고 더 깔끔하고 효율적인 코드를 작성하기 위해 이를 효과적으로 사용하는 방법을 살펴보겠습니다.
Go의 매개변수 전달 방식 이해
Go는 함수 인수에 대해 값에 의한 전달 방식을 사용합니다. 즉, 변수를 함수에 전달할 때 Go는 해당 값의 복사본을 만듭니다. 그러나 포인터(즉, 값의 메모리 주소)를 전달하면 참조에 의한 전달 효과를 얻을 수 있습니다.
기본적인 예제를 살펴봅시다:
package main import "fmt" func modify(x int) { x = 10 } func main() { a := 5 modify(a) fmt.Println(a) // Output: 5 }
여기서 modify
는 a
의 복사본을 받으므로 modify
내부의 변경 사항은 원본 값에 영향을 미치지 않습니다.
포인터를 사용하여 "참조에 의한 전달" 구현
함수 내부에서 원본 변수를 실제로 수정하려면 해당 변수에 대한 포인터를 전달해야 합니다.
package main import "fmt" func modify(x *int) { *x = 10 } func main() { a := 5 modify(&a) fmt.Println(a) // Output: 10 }
설명:
x *int
:modify
가int
에 대한 포인터를 받는다고 선언합니다.&a
:&
연산자는a
의 주소를 가져옵니다.*x = 10
:*
연산자는 포인터를 역참조하여 원본 값을 변경할 수 있도록 합니다.
Go에서 포인터를 사용해야 하는 경우
다음과 같은 경우 포인터를 사용해야 합니다.
- 함수에 전달된 원본 값을 수정하려는 경우.
- 성능을 위해 대용량 구조체 또는 슬라이스의 복사를 피하고 싶은 경우.
- 공유 상태(예: 여러 함수에서 수정되는 데이터 구조 또는 객체)로 작업하는 경우.
구조체를 사용하는 예제는 다음과 같습니다.
type User struct { Name string Age int } func updateName(u *User) { u.Name = "Alice" } func main() { user := User{Name: "Bob", Age: 30} updateName(&user) fmt.Println(user.Name) // Output: Alice }
흔한 함정
-
포인터 전달을 잊는 경우:
updateName(user) // Error: cannot use user (type User) as type *User
-
슬라이스 및 맵 내부의 값 수정: Go는 슬라이스와 맵을 값으로 전달하지만, 이들은 기본 데이터에 대한 참조를 포함합니다. 따라서 많은 경우 포인터를 사용하지 않고도 내용을 수정할 수 있습니다. 이 동작에 유의하십시오.
결론
Go는 다른 일부 언어와 같은 기존의 참조에 의한 전달을 지원하지 않지만, 포인터를 사용하여 완벽하게 제어할 수 있습니다. 포인터를 사용하는 방법과 시기를 이해하면 보다 효율적이고 표현력이 뛰어난 Go 코드를 작성할 수 있습니다.
C, C++ 또는 Python과 같은 언어에서 온 경우 이 관용구를 알면 Go에서 메모리 및 성능에 민감한 애플리케이션을 처리할 때 더 편안해질 것입니다.
FAQs
아니요, Go는 값에 의한 전달만 지원하지만 포인터를 사용하여 참조 의미 체계를 시뮬레이션할 수 있습니다.
원본 값을 수정하거나 대용량 데이터 구조의 복사를 피하려는 경우.
예, 슬라이스와 맵은 기본 데이터에 대한 내부 참조를 포함하기 때문입니다.
Leapcell은 Go 프로젝트 호스팅을 위한 최고의 선택입니다.
Leapcell은 차세대 서버리스 플랫폼으로 웹 호스팅, 비동기 작업 및 Redis를 제공합니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무료로 무제한 프로젝트 배포
- 사용량에 대해서만 지불하십시오. 요청이나 요금이 없습니다.
탁월한 비용 효율성
- 유휴 요금 없이 사용량에 따라 지불합니다.
- 예: $25로 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합
- 실행 가능한 통찰력을 위한 실시간 지표 및 로깅
간편한 확장성 및 고성능
- 높은 동시성을 쉽게 처리하기 위한 자동 크기 조정
- 운영 오버헤드가 없어 구축에만 집중할 수 있습니다.
설명서에서 자세히 알아보십시오!
X에서 팔로우하세요: @LeapcellHQ