Go 치트시트
마지막 업데이트
Hello World 및 프로그램 구조
모든 Go 프로그램은 패키지 안에 있으며, 진입점은 package main의 func main입니다.
| 작업 | 문법 |
|---|---|
| 패키지 선언 | package main |
| 패키지 임포트 | import "fmt" |
| 여러 패키지 임포트 | import (\n "fmt"\n "os"\n) |
| 진입점 | func main() { ... } |
| 한 줄 출력 | fmt.Println("Hello, World!") |
| 서식 지정 출력 | fmt.Printf("%d items\n", n) |
| 파일 실행 | go run main.go |
| 바이너리 빌드 | go build |
변수 및 타입
Go는 정적 타입이지만 :=로 타입을 추론할 수 있습니다.
| 작업 | 문법 |
|---|---|
| 타입과 함께 선언 | var age int = 30 |
| 추론과 함께 선언 | var name = "Ada" |
| 짧은 선언 | count := 0 |
| 한 번에 여러 개 | x, y := 1, 2 |
| 상수 | const Pi = 3.14 |
| 제로 값 | 0, "", false, nil |
| 기본 타입 | int, float64, string, bool, byte, rune |
| 타입 변환 | f := float64(i) |
제어 흐름
Go에는 반복 키워드가 for 하나뿐이며, 조건 주위에 괄호가 없습니다.
| 작업 | 문법 |
|---|---|
| if / else | if x > 0 { ... } else { ... } |
| 초기화 문이 있는 if | if v, ok := m[k]; ok { ... } |
| for 반복문 (C 스타일) | for i := 0; i < 10; i++ { ... } |
| while 스타일 반복문 | for x < 100 { ... } |
| 무한 반복문 | for { ... } |
| 슬라이스 range 순회 | for i, v := range items { ... } |
| switch | switch day { case 1: ...; default: ... } |
| 표현식 없는 switch | switch { case x > 0: ... } |
| break / continue | break, continue |
함수
함수는 일급 값이며 여러 결과를 반환할 수 있습니다.
| 작업 | 문법 |
|---|---|
| 기본 함수 | func add(a int, b int) int { return a + b } |
| 공유 매개변수 타입 | func add(a, b int) int { ... } |
| 여러 반환값 | func divmod(a, b int) (int, int) { return a / b, a % b } |
| 명명된 반환값 | func split(sum int) (x, y int) { x = sum / 2; return } |
| 가변 인자 함수 | func sum(nums ...int) int { ... } |
| 익명 함수 | f := func() { ... } |
| 클로저 | func counter() func() int { ... } |
| defer (반환 시 실행) | defer file.Close() |
슬라이스 및 배열
배열은 크기가 고정되어 있고, 슬라이스는 배열에 대한 동적 뷰입니다.
| 작업 | 문법 |
|---|---|
| 고정 크기 배열 | var a [3]int |
| 슬라이스 리터럴 | nums := []int{1, 2, 3} |
| 슬라이스 만들기 | s := make([]int, 0, 10) |
| 추가 | s = append(s, 4) |
| 길이 / 용량 | len(s), cap(s) |
| 슬라이스 자르기 | s[1:3] |
| 복사 | copy(dst, src) |
| 순회 | for i, v := range s { ... } |
맵
맵은 Go의 내장 해시 테이블입니다.
| 작업 | 문법 |
|---|---|
| 맵 만들기 | m := make(map[string]int) |
| 맵 리터럴 | m := map[string]int{"a": 1, "b": 2} |
| 값 설정 | m["c"] = 3 |
| 값 가져오기 | v := m["a"] |
| 존재 여부 확인 | v, ok := m["x"] |
| 키 삭제 | delete(m, "a") |
| 길이 | len(m) |
| 순회 | for k, v := range m { ... } |
구조체 및 메서드
구조체는 필드를 묶고, 메서드는 리시버를 통해 동작을 붙입니다.
| 작업 | 문법 |
|---|---|
| 구조체 정의 | type Point struct { X, Y int } |
| 인스턴스 생성 | p := Point{X: 1, Y: 2} |
| 필드 접근 | p.X |
| 구조체 포인터 | p := &Point{1, 2} |
| 값 리시버 메서드 | func (p Point) Dist() float64 { ... } |
| 포인터 리시버 메서드 | func (p *Point) Move(dx int) { p.X += dx } |
| 임베디드 구조체 | type Circle struct { Point; R int } |
| 구조체 태그 | Name string에 백틱으로 감싼 json:"name" 태그 |
인터페이스
인터페이스는 암묵적으로 충족됩니다 - 올바른 메서드를 가진 어떤 타입이든 자격이 됩니다.
| 작업 | 문법 |
|---|---|
| 인터페이스 정의 | type Shape interface { Area() float64 } |
| 구현 (암묵적) | func (c Circle) Area() float64 { ... } |
| 빈 인터페이스 (any) | var x interface{} 또는 var x any |
| 타입 단언 | s, ok := x.(string) |
| 타입 스위치 | switch v := x.(type) { case int: ... } |
| Stringer 인터페이스 | func (p Point) String() string { ... } |
고루틴 및 채널
고루틴은 경량 스레드이고, 채널은 그들 사이에서 값을 전달합니다.
| 작업 | 문법 |
|---|---|
| 고루틴 시작 | go doWork() |
| 채널 만들기 | ch := make(chan int) |
| 버퍼 채널 | ch := make(chan int, 5) |
| 채널로 보내기 | ch <- 42 |
| 채널에서 받기 | v := <-ch |
| 채널 닫기 | close(ch) |
| 채널 range 순회 | for v := range ch { ... } |
| 채널에 대한 select | select { case v := <-ch: ...; default: ... } |
| wait group | var wg sync.WaitGroup; wg.Add(1); wg.Wait() |
| 뮤텍스 | var mu sync.Mutex; mu.Lock(); mu.Unlock() |
오류 처리
Go는 오류를 값으로 반환합니다 - 예외가 없습니다.
| 작업 | 문법 |
|---|---|
| 오류 반환 | func read() (string, error) { return "", err } |
| 오류 확인 | if err != nil { return err } |
| 오류 생성 | errors.New("not found") |
| 서식 지정 오류 | fmt.Errorf("bad id %d", id) |
| 오류 래핑 | fmt.Errorf("load: %w", err) |
| 언래핑 / 일치 | errors.Is(err, os.ErrNotExist) |
| 타입으로 일치 | errors.As(err, &target) |
| panic / recover | defer func() { recover() }() |
가장 자주 쓰는 Go 문법을 한 페이지에 담았습니다. 이 Go 치트시트는 언어 핵심을 위한 빠른 참조 자료입니다 - 변수와 타입, 슬라이스와 맵, 구조체와 인터페이스, 그리고 Golang이 동시성에서 빛나게 해주는 고루틴과 채널을 다룹니다.
여기 나오는 모든 내용은 표준 Go이며 공식 툴체인으로 컴파일됩니다. 필요한 것을 복사하거나, Go 플레이그라운드에서 모든 코드를 바로 실행해 보세요 - 설치가 필요 없습니다.
Go 치트시트 자주 묻는 질문
이 Go 치트시트는 무료인가요?
Go에서 :=와 var의 차이는 무엇인가요?
var x = 0은 변수를 선언하며 패키지 수준을 포함해 어디서나 동작합니다. x := 0은 짧은 변수 선언입니다: 선언과 대입을 함께 하고, 타입을 추론하며, 함수 안에서만 사용할 수 있습니다. 명시적 타입이나 패키지 수준 변수가 필요할 때는 var를, 간결한 지역 선언에는 :=를 사용하세요.고루틴과 채널이란 무엇인가요?
go someFunc()라고 작성해 시작합니다. 채널은 고루틴이 안전하게 통신하게 해주는 타입이 있는 파이프입니다: 한 고루틴은 ch <- v로 보내고 다른 고루틴은 <-ch로 받습니다. 둘은 함께 Go의 핵심 동시성 모델을 이루며, "통신으로 메모리를 공유하라"는 말에 잘 담겨 있습니다.