Go
Go는 구글이 개발한 프로그래밍 언어이다. 가비지 컬렉션 기능이 있고, 병행성(concurrent)을 잘 지원하는 컴파일 언어다.
Go의 초기 디자인은 2007년 9월 21일에 로버트 그리즈머, 롭 파이크, 켄 톰슨이 Inferno 분산 운영체제와 관련된 작업을 하다가 시작되었다. 화이트 보드에 새로운 언어에 대한 스케치를 하면서 초기 20% 파트타임 프로젝트로 시작하였다가 2008년 1월 켄 톰슨이 C 코드를 만들어내는 컴파일러를 만들기 시작했고, 2008년 중반 풀타임 프로젝트로 승격되었다. 2008년 5월 이안 테일러가 Go 스펙의 초안을 이용해서 GCC 프론트엔드를 만들기 시작했고, 2008년 말 러스 콕스가 참여하면서 프로토타입에서 실질적인 언어와 라이브러리들을 만들기 시작했다. 2009년 11월 10일에 리눅스와 Mac OS X 플랫폼을 대상으로 공식 발표되었다. Go가 처음 런칭되었을 때는 실무적인 소프트웨어를 만들기에는 준비가 좀 덜 된 상태였지만, 2010년 5월 롭 파이크는 구글에서 실제로 사용되고 있는 부분이 있다고 공개적으로 알리게 되었다.
Environment
- GOROOT
- Go가 설치된 디렉토리(윈도우즈의 경우 디폴트로
C:\Go
)를 가리키며, Go 실행파일은GOROOT/bin
폴더에, Go 표준 패키지들은GOROOT/pkg
폴더에 있다. (윈도우즈에 GO 설치시 시스템 환경변수로 자동으로 설정된다)
- GOPATH
- Go는 표준 패키지 이외의 3rd Party 패키지나 사용자 정의 패키지들을 이
GOPATH
에서 찾는다. 복수 개의 경로를 지정한 경우, 3rd Party 패키지는 처음 경로에 설치된다.
Libraries
- TinyGo - A Go Compiler For Small Places
WebRTC
Web Frameworks
Go에서 웹 프로그래밍을 쉽게 도와주는 여러 Web Framework들이 현재 개발 중에 있다. 간단한 웹 서버를 만들기 위해 net/http 패키지를 사용하면 되겠지만, 복잡하고 다양한 기능을 요하는 웹 서버인 경우 여러 기능들이 탑재된 Web Framework을 사용하는 것이 좋다.
일반적으로 Web Framework은 Request와 Handler를 매핑하는 Routing 기능, Request 파라미터들은 핸들러의 파라미터에 연결하는 데이타바인딩 기능, Request 상태를 유지하는 컨텍스트 기능, 핸들러들에서 자주 쓰이는 공통된 기능을 제공하는 미들웨어 기능 등 실무에서 자주 요구되는 기능들을 갖추고 있다.
다음은 현재 사용되는, 혹은 개발되고 있는 Go Web Framework들이다. 각 프레임워크마다 제공되는 기능이 다르므로, 필요한 기능이 이미 구현되었는지 아니면 개발 예정인지를 미리 체크해야 한다.
- Revel: https://revel.github.io
- Beego: http://beego.me
- Martini: https://github.com/go-martini/martini
- Gin: https://gin-gonic.github.io/gin
- GoCraft: https://github.com/gocraft/web
- Traffic: https://github.com/pilu/traffic
- Gorilla: http://www.gorillatoolkit.org
- Echo Web Framework
- Copper - Go용 Web App 툴킷
- PocketBase - 단 하나의 파일로 구성된 오픈소스 벡엔드
Terminal/Console
Git
- lazygit - simple terminal UI for git commands
ETC
Debugging
- Delve is a debugger for the Go programming language.
Performance
- pprof++ - A Go Profiler with Hardware Performance Monitoring
Desktop
- Wails - 데스크톱 응용 프로그램 개발 프레임 워크
Machine Learning
Compiler
- gARM - ARM64에 특화된 고성능 Go 컴파일러
Hello, World!
아래와 같이 main.go
파일을 생성한다.
아래와 같이 컴파일 한 후 실행하면 된다.
또는 아래와 같이 바로 실행할 수 있다.
Basic
주석과 함께 정리한다.
package main // 패키지명을 적는다.
func main() { // 함수명을 적는다.
var a int = 11 // 변수 문법: var [변수명] [타입] [ = 초기값]
const b int = 11 // 상수 문법: const [상수명] [타입] [ = 값]
println("a value:", a) // stdout 출력.
println("b value:", b) // stdout 출력.
var c = "haha" // 이런식으로 타입 추론이 가능하다. (상수도 가능)
println("c value:", c)
var d, e int = 33, 44 // 연달아 적는 것도 가능하다.
var f, g = 55, "Six" // 연달아 적을 때 추론이 가능하며, 다른 타입을 적는 것도 가능하다.
println("d, e value:", d, e)
println("f, g value:", f, g)
// 아래와 같이 상수를 열거할 수도 있다.
const (
Visa = "Visa"
Master = "MasterCard"
Amex = "American Express"
)
const (
Apple = iota // 0
Grape // 1
Orange // 2
)
}
Debugging
- Debugging Go Code with GDB
- Debugging Go Code with LLDB
- Debug Golang applications: LLDB
- Debugging With Vim Go - vim/go/vim-go Debugging
Coding Guideline
Troubleshooting
Undefined: sort.Slice
# github.com/go-delve/delve/pkg/proc
.golang/src/github.com/go-delve/delve/pkg/proc/fncall.go:338: undefined: sort.Slice
최신버전으로 업데이트하면 된다. (2019년 01월 21일, 1.11.4 버전으로 업데이트하여 해결했다)
Favorite site
- The Go Programming Language
- Wikipedia (en) GO에 대한 설명
- [추천] Python vs Go 비교 레퍼런스 (Python과 Go의 비교 레퍼런스 ~ 각기 버전은 Python 3.5+와 Go 1.7+ ~)
Tutorials
- Go를 향한 여행
- [추천] 예제로 배우는 GO 프로그래밍
- Go언어 시작하기
- Go 프로그래밍 입문(An Introduction to Programming in Go) - 간단하게 설명되어있다.
Guide
- [추천] 구조적 동시성에 대한 소고, 또는 Go 문의 해로움
- go를 위한 vim 환경설정 (vim-go)
- 컨테이너 내부 Go 애플리케이션 디버깅하기
- Golang 패키지 이름(Package Names)
- 안전하게 사용하는 Golang
- [추천] How to start a Go project in 2023 | Ben E. C. Boyter - 2023년에 Go 프로젝트를 시작하는 방법
- 안전한 Go 코드 작성하기 | GeekNews
Article
- Golang vs Rust 퍼포먼스 벤치마킹 썰 (Go, Rust)
- "러스트"와 "고"를 선택하는 방법 (Go, Rust)
- Go vs Bun, Go 언어는 정말 JS 런타임보다 빠를까? | GeekNews (go, bun)
- 가끔 Go는 No-Go가 되어야 합니다 | GeekNews
- 저자가 Go 언어를 수년간 사용한 후 Java로 전환하게 되면서 느낀 Go 언어의 한계점과 문제점을 설명하는 글
- Go가 단순하고 지루한(boring) 언어라는 특징이 장점이 아닌 단점이 될 수 있다는 관점을 제시함
- Go의 철학: Google의 Go 설계 팀은 단순함과 제한성을 강조했지만, 이는 사용자가 직접 해결해야 하는 반복 작업을 야기함