관리 메뉴

HAMA 블로그

Go 언어에서 포인터는 언제 사용 해야 하나? 본문

Go

Go 언어에서 포인터는 언제 사용 해야 하나?

[하마] 이승현 (wowlsh93@gmail.com) 2019. 10. 11. 18:57


C++ 에서 최적화를 언급 할 때 "객체복사가 최대한 일어나지 않게 한다" 가 주요 화두를 차지 한다. ("알고리즘"을 개선하라도  중요하긴 하지만) 이에 따라서 RVO 같은 개념도 생겨나고, 아예 RVO를 믿지 못하고 매개변수에 리턴 받을 포인터를 전달하는 형태를 취하기도 한다. 

마찬가지로 Go에서도 아래 처럼 *peer,Proposal 같은 포인터를 넘겨 주면서 객체복사에 대한 낭비를 줄이는데

// GetProposal returns a Proposal message from its bytes
func GetProposal(propBytes []byte) (*peer.Proposal, error) {
	prop := &peer.Proposal{}
	err := proto.Unmarshal(propBytes, prop)
	return prop, errors.Wrap(err, "error unmarshaling Proposal")
}

사실 위의 코드를 C,C++개발자가 보면 식겁 하며 지역에서 할당된 객체의 포인터를 리턴 해 주면 이건 "죽은 자식 불알 만지기" 가 되는게 아니냐로 반문 할 수 있을 것이지만, Go언어에서는 외부로 레퍼런싱 되는 객체의 경우 힙에 할당해 주며 자동으로 관리 해 준다. (참고: Go Memory Management)

 

Go Memory Management

All computing environments must deal with memory management. This article discusses some memory management concepts used by the Go programming language. This article is written for programmers familiar with basic memory management concepts but unfamiliar w

dougrichardson.org

위에서 포인터와 레퍼런싱이라는 말을 혼용해서 사용했는데 Go에서 이 차이는 아래와 같다 (Go에서 C++식 reference는 없고, Pointer 와 Value만 있다고 생각하자) . https://spf13.com/post/go-pointers-vs-references

 

Pointers vs References : spf13.com

 

spf13.com

한글로 쉽게 설명한 블로그 발견 
https://jacking75.github.io/go_stackheap/

 

golang - 스택과 힙에 대해 - jacking75

실행 시 동적으로 메모리를 확보하는 영역으로서 스택과 힙이 있다. 스택 메모리는 함수 호출 스택을 저장하고 로컬 변수, 인수, 반환 값도 여기에 둔다. 스택의 Push와 Pop은 고속이므로 객체를 ��

jacking75.github.io


다음은 Go언어에서포인터를 사용해서 효율적인 코딩을 하려는 사람들에게 좋은 지침이 될 것 같은 글을 스택오버플로우에서 발견하여 공유하고자 한다. 해당 링크는 아래에 있다.  https://stackoverflow.com/questions/23542989/pointers-vs-values-in-parameters-and-return-values

 

Pointers vs. values in parameters and return values

In Go there are various ways to return a struct value or slice thereof. For individual ones I've seen: type MyStruct struct { Val int } func myfunc() MyStruct { return MyStruct{Val: 1} } ...

stackoverflow.com

3줄 요약) 

  • 리시버 포인터를 사용하는 메소드는 일반적으로 메소드는 리시버 포인터를 사용한다. the rule of thumb for receivers is, "확실하지 않으면 포인터를 사용하세요!!."
  • Slices, maps, channels, strings, function values, 와 interface values 는 내부에 포인터로 구현되 있으므로 굳이 포인터로 처리하는 것은 낭비이다.
  • 거대한 구조체와 변경되길 원하는 구조체에는 포인터를 사용하고, 그 밖에는 value로 넘겨라. 난데없는 변경은 (포인터를 통한) 혼란을 일으킨다. Immutablity 가 중요할때가 많다. 

'Go' 카테고리의 다른 글

안전하게 사용하는 Golang  (2) 2020.06.16
go microservices  (0) 2019.02.28
[Golang] recover 는 언제 사용하나?  (1) 2019.02.22
고성능을 위한 GO  (0) 2019.02.13
[이더리움에서 배우는 Go언어] select 의 거의 모든 패턴들  (1) 2019.02.08
Comments