일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 하이퍼레저 패브릭
- 플레이프레임워크
- 블록체인
- Hyperledger fabric gossip protocol
- CORDA
- play 강좌
- 주키퍼
- Play2 로 웹 개발
- 엔터프라이즈 블록체인
- Akka
- Play2
- akka 강좌
- hyperledger fabric
- 스위프트
- 파이썬 데이터분석
- play2 강좌
- 파이썬 머신러닝
- Golang
- 스칼라
- 그라파나
- 파이썬 강좌
- 이더리움
- 스칼라 강좌
- Actor
- 하이브리드앱
- 파이썬
- 안드로이드 웹뷰
- 스칼라 동시성
- Adapter 패턴
- 파이썬 동시성
- 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 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 |