티스토리 뷰
소개
- 2009년 11월에 구글에서 처음 발표된 후 2012년 3월에 정식 발표된 프로그래밍 언어.
- 로버트 그리즈머, 롭 파이크, 케네스 톰슨[2]이 디자인
- Go는 명시하고 있지 않지만 단순함과 실용성을 지향하는 언어다. keyword가 25개밖에 되지 않고 문법 또한 간결해 입문이 쉬운 편이다.
- Go는 바이너리 컴파일러이므로 서로 다른 머신 플랫폼들을 타깃으로 배포해야 할 경우 환경변수(GOOS와 GOARCH 등)를 그에 맞게 설정한 후 컴파일해서 여러 벌의 배포판을 만들어야 한다.
- 개발 속도와 실행 속도, 병행성 사이의 적정 지점이 필요한 서버 애플리케이션 개발에 많이 사용되는 편
- 컨테이너 기반 가상화 도구인 Docker, Kubernetes를 작성하는 데 사용된 언어로 유명
- 이더리움의 메인 클라이언트인 Geth 역시 Go로 작성
- Go는 이미 시장에서 인정받은, 안정성이 검증된 언어
장점
- 컴파일 언어이지만 컴파일러의 컴파일 속도가 매우 빨라 인터프리터 언어처럼 쓸 수 있다는 점
- 언어의 문법 구조를 개선함으로써 달성
- 간결한 코드
- 컴파일 언어답게 높은 성능을 낼 수 있다는 점이 호평
- 풍부한 라이브러리 덕택에 막강한 기능을 쉽게 구현할 수 있다는 것
- 고루틴 비동기 메커니즘
- Erlang에서 영향을 받은 것으로 각각의 고루틴은 병렬로 동작하며 메시지 채널을 통해 값을 주고받는다
단점
- 컴파일 언어 중에서는 매우 빠른 편이지만 아무래도 인터프리터 언어의 즉흥성까지 바라는 건 무리
- 대형 모듈을 이것저것 붙이면 컴파일에 필요한 시간이 있기에 Python 등의 인터프리터 언어보다는 기계어 번역 시 확실히 반응이 느릴 수밖에
- 바이트코드를 생성하는 언어가 아니므로, 해당 타깃 머신에 맞춰서 각각 컴파일해야 한다
- Go 언어의 설계 지향점은 시스템 프로그래밍 언어였지만, 가비지 컬렉션의 지원이나 제네릭의 부재로 인해 박싱/언박싱이 불필요하게 많이 일어나는
- 실제로 고성능 연산에 사용하기에는 C/C++에 비해 느리며, 저수준 시스템 개발에서는 가비지 컬렉션과 고루틴을 지원하기 위한 무거운 런타임 등으로 인해 사용이 불가능에 가깝
- 현대 프로그래밍 언어 연구의 성과를 일체 무시한 언어 설계
- 많은 종류의 프로그램 버그는 프로그래밍 언어 차원에서 원천적으로 차단
- 프로그래밍 언어 연구자들은 쓰기 쉬우면서도 최대한 많은 버그를 컴파일 시점에 잡을 수 있는 타입 시스템
- Go에서는 널 포인터나 안전하지 않은 타입 캐스팅의 유발 등 수많은 버그의 원천들에 전혀 손을 대지 않았다는 것
Deep dives
Concurrent
- https://yoonhona.github.io/posts/2020/07/02/go-csp.html
- Introduction to Concurrency (Concurrency in Go #1
- https://madeddu.xyz/posts/go-async-await/
- https://jusths.tistory.com/142
Generics
- https://go.dev/blog/why-generics
- https://medium.com/hackernoon/why-go-doesnt-have-generics-b40ef9e69833
- https://bitfieldconsulting.com/golang/generics
- https://dalijap.blogspot.com/2021/09/are-generics-slow.html
- What's the difference between generic and non-generic use of interfaces?
Go Routine
- https://tech.ssut.me/goroutine-vs-threads/
- https://stonzeteam.github.io/How-Goroutines-Work/
- https://www.timqi.com/2020/05/15/how-does-gmp-scheduler-work/
Channels
CSP
Todo
- why not allow nested function
- Marshaling/Unmarshaling
- Serialization vs Marshaling
- struct{} vs &struct{}
- type assertion
- go ORM
- module/packages
- enum
- extending python with go
- settings
- pipeline pattern
- clean architecture
- reflect 사용법
- 경량 docker image
- goent
- init()
- debugging
- context
- validator
- select 패턴
- ci/cd
- test
Packages
- https://github.com/golang-standards/project-layout
- 추천되는 go 프로젝트 구조
공부 방법
1. 기본 문법 학습
- http://golang.site/go/article/21-Go-루틴-goroutine
- https://go-tour-ko.appspot.com/welcome/1
- https://gosudaweb.gitbooks.io/effective-go-in-korean/content/
Links
- Standard Libraries: golang.org/pkg/
- 패키지 검색: https://pkg.go.dev/
- 추천 패키지 모음:https://awesome-go.com/#web-frameworks
- Russ Cox Blog: https://research.swtch.com/
- Dave cheney Blog: https://dave.cheney.net/category/golang
- 예제로 살펴보는 go언어: https://www.joinc.co.kr/w/man/12/golang
- boilerplate: https://dev.to/koddr/go-fiber-by-examples-working-with-middlewares-and-boilerplates-3p0m
Reference
반응형
'Programming' 카테고리의 다른 글
No Operation(no-op, nop, noop) (0) | 2022.01.11 |
---|---|
Generic 과 Boxing&Unboxing (0) | 2021.11.24 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- HTTP/3
- web_server
- Isolate level
- no-op
- 프리온보딩
- k8s
- 창업
- thetextbook
- inflearn
- buildkit
- Network
- cka
- 덕타이핑
- HTTP/2
- Git
- direnv
- GitHub
- docker-compose
- user-agent
- http
- MSA
- 원티드
- go
- Complier
- 위코드
- gitignore
- pytest
- QUIC
- database
- Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함