관리 메뉴

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에서 이 차이는 아래와 같다. https://spf13.com/post/go-pointers-vs-references/

 

Pointers vs References : spf13.com

 

spf13.com


다음은 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

0 Comments
댓글쓰기 폼