일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 스위프트
- 파이썬 동시성
- 스칼라
- 파이썬 강좌
- Adapter 패턴
- Akka
- 파이썬 데이터분석
- Actor
- 플레이프레임워크
- 안드로이드 웹뷰
- akka 강좌
- Hyperledger fabric gossip protocol
- 하이브리드앱
- Play2 로 웹 개발
- 이더리움
- 그라파나
- 스칼라 강좌
- 블록체인
- 주키퍼
- 엔터프라이즈 블록체인
- hyperledger fabric
- 파이썬
- Play2
- Golang
- 스칼라 동시성
- play2 강좌
- 파이썬 머신러닝
- 하이퍼레저 패브릭
- play 강좌
- CORDA
- Today
- Total
HAMA 블로그
Go 언어에서 포인터는 언제 사용 해야 하나? 본문
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에서 이 차이는 아래와 같다 (Go에서 C++식 reference는 없고, Pointer 와 Value만 있다고 생각하자) . https://spf13.com/post/go-pointers-vs-references
한글로 쉽게 설명한 블로그 발견
https://jacking75.github.io/go_stackheap/
다음은 Go언어에서포인터를 사용해서 효율적인 코딩을 하려는 사람들에게 좋은 지침이 될 것 같은 글을 스택오버플로우에서 발견하여 공유하고자 한다. 해당 링크는 아래에 있다. https://stackoverflow.com/questions/23542989/pointers-vs-values-in-parameters-and-return-values
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 |