Go 치트시트 — 빠른 레퍼런스
Go 1.22 문법, 타입, goroutine, 그리고 가장 자주 쓰이는 표준 라이브러리를 모은 빠른 레퍼런스입니다. 일상 작업의 약 80%를 다룹니다.
Go Go 1.22
Go (gc toolchain) · 컴파일형 · 동시성 · 명령형 · 정적 · 강한 타입 · 구조적 타입(인터페이스)
추천 학습 경로
먼저 go run / go build와 go.mod 사용법을 익히고, 변수·타입·제어 흐름을 학습하세요. 그다음 함수·포인터·구조체를 깊이 다루고 슬라이스와 맵으로 데이터를 정리합니다. 인터페이스와 오류 처리를 이해한 뒤 goroutine과 채널로 동시성을 작성하세요. 그 후 필요할 때 http, context, 시간, 빌드/테스트를 익히면 됩니다. 함정을 다시 살펴보고 싶을 때는 FAQ 섹션을 참고하세요.
1.Hello World 및 빌드 환경
Go 프로그램 실행, go.mod 모듈, 도구 체인을 다룹니다.
최소 프로그램
모든 프로그램은 package main과 func main을 진입점으로 합니다. fmt로 출력합니다.
실행과 빌드
go run은 컴파일 후 실행, go build는 실행 파일 생성, go install은 $GOBIN에 설치합니다.
go.mod 모듈
go.mod는 모듈 경로와 의존성을 선언합니다. go mod init으로 초기화, go mod tidy로 정리합니다.
패키지와 임포트
import로 표준 라이브러리와 서드파티를 가져옵니다. 같은 디렉터리의 파일은 같은 패키지입니다. 사용하지 않은 임포트는 컴파일 오류입니다.
포맷 출력
fmt.Println/Printf/Print가 기본입니다. Printf는 %s %d %v 같은 동사를 쓰고, Sprintf는 문자열을 반환합니다.
인자와 입력
os.Args로 명령줄 인자에 접근하고, flag 패키지로 파싱하며, fmt.Scan으로 입력을 받습니다.
다중 파일 프로그램
같은 디렉터리의 여러 .go 파일은 같은 패키지에 속하며 패키지 스코프를 공유합니다.
도구 체인
go version으로 버전, go env로 환경 변수, go doc으로 문서, go fmt로 포맷팅을 확인합니다.
2.변수와 상수
변수 선언, 짧은 선언, 상수, 영값, 타입 변환을 다룹니다.
변수 선언
var로 변수를 선언하며 타입은 변수명 뒤에 둡니다. 초기화하거나 영값을 받습니다.
짧은 변수 선언
:=는 타입 추론과 함께 선언과 초기화를 동시에 합니다. 함수 안에서만 사용할 수 있으며 왼쪽에 최소 하나의 새 변수가 있어야 합니다.
상수
const는 컴파일 시점에 정해지는 상수입니다. iota로 자동 증가하는 열거형을 정의할 수 있습니다.
영값
초기화하지 않은 변수는 영값을 가집니다: 숫자는 0, 문자열은 "", bool은 false, 포인터는 nil. 영값도 바로 사용할 수 있습니다.
다중 대입
한 줄에 여러 변수에 값을 대입하고 교환할 수 있습니다. 함수의 다중 반환값도 분해해서 받을 수 있습니다.
스코프
블록 스코프가 기본입니다. 함수 안의 변수는 블록 내부에서만 보입니다. 섀도잉에 주의하세요.
타입 변환
T(x)로 명시적 변환을 수행합니다. Go는 숫자 타입을 암묵적으로 변환하지 않으며 변환 시 오버플로와 절단이 일어날 수 있습니다.
명명 규칙
첫 글자가 대문자면 패키지 외부로 공개되고, 소문자면 패키지 내부 전용입니다. 카멜케이스를 쓰고 로컬 변수는 짧게 짓습니다.
3.데이터 타입
내장 타입, 구조체, 배열, 인터페이스, 제네릭을 다룹니다.
기본 타입
bool, string, 정수, 부동소수, 복소수, 그리고 byte/rune 별칭이 있습니다.
수치 연산
산술 연산, 비트 연산, math 패키지를 사용합니다. 정수 나눗셈은 절단되며 오버플로에 주의하세요.
struct
구조체는 필드를 묶은 타입입니다. 필드명 또는 위치로 초기화하며 태그로 메타데이터를 붙입니다.
배열
배열은 길이가 고정된 값 타입(복사됩니다)입니다. 직접 쓰기보다 슬라이스를 더 자주 사용합니다.
type 정의
type으로 새 타입 또는 별칭을 정의합니다. 정의된 타입은 기존 타입과 다르며 변환이 필요합니다.
제네릭
제네릭 함수는 [T any] 같은 타입 매개변수를 사용하며, 제약 인터페이스로 허용 타입을 제한합니다.
interface 타입
인터페이스는 메서드 집합을 정의합니다. 빈 인터페이스 interface{}(any)는 임의의 타입을 보관합니다.
comparable 제약
comparable은 ==로 비교 가능한 타입을 나타내는 내장 제약입니다. 맵 키와 제네릭 비교에 사용됩니다.
4.포인터
포인터와 주소 연산: 주소 가져오기, 역참조, new/make, 스택과 힙을 다룹니다.
주소 가져오기 &
&는 변수의 주소를 가져와 포인터를 반환합니다. 포인터는 변수의 메모리 위치를 가리킵니다.
역참조 *
*p는 포인터가 가리키는 값에 접근합니다. 구조체 포인터는 자동으로 역참조됩니다.
nil 포인터
nil 포인터는 영값입니다. nil을 역참조하면 패닉하므로 사용 전에 검사하세요.
포인터 매개변수
포인터 매개변수는 호출자의 변수를 변경할 수 있습니다. 값 매개변수는 복사본입니다. 큰 구조체는 포인터로 전달해 복사를 줄입니다.
new와 make
new는 값 타입에 메모리를 잡아 포인터를 반환하고, make는 슬라이스·맵·채널을 초기화합니다. 용도가 다릅니다.
포인터 관용구
포인터는 가변 상태를 공유할 때 사용합니다. 반환 타입과 메서드 리시버는 의미에 맞춰 결정하세요.
스택과 힙
변수가 스택과 힙 어디에 놓일지는 컴파일러의 이스케이프 분석이 결정합니다. 주소를 가져가면 힙으로 이스케이프될 수 있습니다.
포인터 안전성
Go 포인터에는 산술 연산이 없습니다(C 스타일 p+1 불가). GC가 수명을 관리해 댕글링 포인터가 없습니다.
5.제어 흐름
if, for, switch, defer, 반복 제어를 다룹니다.
if / else
if 조건에 괄호는 없습니다. 조건 앞에 짧은 초기화 문을 둘 수 있으며 조건은 반드시 불리언이어야 합니다.
for 루프
Go에는 for 루프만 있습니다. C 스타일 3단 형태, while 스타일 조건, 무한 루프 세 가지 형태가 있습니다.
range 반복
range는 배열, 슬라이스, 맵, 문자열, 채널을 순회합니다. Go 1.22부터 루프 변수는 매 반복마다 독립됩니다.
switch
switch는 기본적으로 fall through하지 않습니다. 여러 값, 표현식 생략(if-else 체인), 타입 스위치를 지원합니다.
defer
defer는 함수 종료 시 실행될 작업을 등록합니다. LIFO 순서로 실행되며 자원 정리에 자주 쓰입니다.
break와 continue
break는 루프를 빠져나가고 continue는 다음 반복을 건너뜁니다. 레이블로 중첩 루프도 제어할 수 있습니다.
초기화가 있는 switch
switch 앞에 초기화 문을 둘 수 있습니다. 오류 처리 체인에서 유용합니다.
goto와 레이블
goto는 레이블로 점프합니다. Go에서 지원은 하지만 거의 쓰이지 않으며, 깊게 중첩된 오류 처리에 제한적으로 사용됩니다.
6.함수
함수 정의, 다중 반환값, 클로저, 메서드, 함수 값을 다룹니다.
함수 정의
func로 함수를 정의합니다. 매개변수는 타입을 가지고 반환 타입은 마지막에 둡니다.
다중 반환값
Go 함수는 여러 값을 반환할 수 있습니다. 관용적으로 (값, error) 형태를 사용합니다.
이름 있는 반환값
반환값에 이름을 붙일 수 있습니다. 함수 안에서 대입하고 bare return으로 보낼 수 있습니다.
가변 인자
...T로 임의 개수의 인자를 슬라이스로 모읍니다. 호출 시 slice...로 펼쳐 전달합니다.
클로저
클로저는 바깥 변수를 캡처합니다. 반환된 함수는 자신의 상태를 유지합니다. 1.22부터 루프 변수는 반복마다 캡처됩니다.
메서드
메서드는 리시버를 통해 타입에 묶이며, 리시버는 func와 메서드 이름 사이에 적습니다.
함수 값
함수는 1급 시민으로 변수에 대입하거나 인자/반환값으로 쓸 수 있습니다. 함수 타입은 시그니처로 표현됩니다.
init 함수
init은 패키지가 임포트될 때 자동으로 실행됩니다. 한 파일에 여러 init을 둘 수 있으며 초기화에 사용됩니다.
7.문자열
불변 문자열, rune/바이트, strings 패키지, 포맷팅을 다룹니다.
문자열 기초
문자열은 불변의 바이트열입니다. 큰따옴표는 일반 문자열, 백틱은 로 문자열 리터럴입니다.
rune과 문자
rune은 유니코드 코드 포인트(int32)입니다. range는 rune 단위로 순회하며 unicode/utf8 패키지가 디코딩을 도와줍니다.
strings.Builder
Builder는 문자열을 효율적으로 누적합니다. 루프 안의 + 결합보다 할당이 적습니다.
strings 패키지
Contains, Split, Join, Trim, Replace 등 다양한 문자열 연산이 있습니다.
fmt 포맷팅
Printf/Sprintf의 동사와 폭, 정밀도, 채움을 제어할 수 있습니다. Fprintf는 io.Writer에 씁니다.
strconv 변환
문자열과 숫자/불리언 상호 변환, 그리고 따옴표 처리를 다룹니다.
인코딩 처리
base64, hex, URL 인코딩을 다루고 []byte와 문자열 사이의 변환도 함께 알아봅니다.
문자 순회
비 ASCII 텍스트는 rune 단위로 순회하는 것이 안전합니다. 인덱스는 바이트 단위임을 잊지 마세요.
8.컬렉션
슬라이스, 맵, 배열, 정렬을 다룹니다.
슬라이스 slice
슬라이스는 내부 배열에 대한 동적 뷰입니다. nil 슬라이스도 길이 0이며 append 등에 사용 가능합니다.
슬라이스 연산
append로 추가, copy로 복제, 그리고 append 관용구로 삭제/삽입을 수행합니다.
make와 용량
make는 슬라이스를 만들면서 용량을 미리 잡습니다. append 중 잦은 재할당을 줄여주며 cap으로 용량 증가 전략을 제어합니다.
map
맵은 키/값 쌍을 저장합니다. make로 생성하고 읽기/쓰기/삭제/순회가 가능합니다. nil 맵은 읽기 전용입니다.
map 관용구
맵을 집합, 카운터, 캐시로 활용합니다. 키를 기준으로 값을 모을 때도 유용합니다.
정렬
sort 패키지로 슬라이스를 정렬합니다. 비교 함수를 직접 전달할 수 있고 sort.Search로 이분 탐색도 가능합니다.
container 패키지
container/heap은 힙, container/list는 양방향 연결 리스트를 제공합니다. 자료구조가 필요할 때 사용합니다.
반복 팁
range로 인덱스나 값을 받고, 맵은 키를 정렬해 순회하면 안정적인 순서를 얻습니다.
9.메모리와 성능
가비지 컬렉션, 이스케이프 분석, 할당 최적화, 메모리 프로파일링을 다룹니다.
가비지 컬렉션
Go는 동시·저지연 자동 GC를 제공합니다. free를 직접 호출할 필요가 없습니다.
이스케이프 분석
변수의 배치 위치는 컴파일러가 결정합니다. 주소를 가져가거나 인터페이스로 박싱하면 힙으로 이스케이프할 수 있습니다.
할당 최적화
용량을 미리 잡고 버퍼를 재사용하며 작은 할당을 줄여 핫패스를 최적화합니다.
파이너라이저
runtime.SetFinalizer는 객체 회수 직전 정리 함수를 등록합니다. 외부 자원의 안전망으로 사용할 수 있습니다.
메모리 모델
동시성 환경에서 쓰기는 채널, 락, atomic 같은 동기화 이벤트가 있을 때만 다른 goroutine에게 보입니다.
메모리 프로파일링
pprof로 메모리와 CPU를 프로파일링할 수 있습니다. 힙 스냅샷은 누수 추적에 유용합니다.
sync.Pool
Pool은 수명이 짧은 객체를 재활용해 GC 부담을 줄입니다. 버퍼·디코더에 잘 어울립니다.
스택과 재귀
goroutine의 스택은 동적으로 자라지만 깊게 중첩된 재귀에는 한계가 있습니다. 너무 깊은 재귀는 루프로 바꾸세요.
10.구조체와 메서드
Go의 OOP: 구조체, 인터페이스, 임베딩과 합성(클래스 상속 없음).
struct와 메서드
구조체는 데이터를 담고 메서드로 동작을 부여합니다. 생성자 함수로 인스턴스를 만드는 것이 관례입니다.
리시버 선택
값 리시버는 원본을 바꾸지 않고 포인터 리시버는 바꿉니다. 같은 타입의 메서드들은 리시버 종류를 통일하세요.
인터페이스
인터페이스는 동작 계약을 정의하며 메서드 집합이 일치하면 타입이 암묵적으로 구현합니다.
인터페이스와 nil
nil 인터페이스와 타입 있는 nil 포인터를 담은 인터페이스는 다릅니다. nil 판별에 주의하세요.
임베딩
임베드한 구조체나 인터페이스의 필드와 메서드는 자동으로 승격됩니다. 상속보다 합성을 우선하세요.
합성
Go는 상속 대신 합성으로 재사용을 표현합니다. 작은 인터페이스를 조합해 큰 인터페이스를 만듭니다.
타입 어서션
인터페이스를 구체 타입으로 단언합니다. ok 패턴으로 안전하게 검사하고, type switch로 여러 분기를 처리하세요.
any / 빈 인터페이스
any는 interface{}의 별칭으로 임의 타입을 보관합니다. 사용할 때는 타입 어서션이 필요합니다.
11.오류 처리
error 인터페이스, 오류 래핑, errors.Is/As, panic/recover를 다룹니다.
error 인터페이스
error는 Error() string 한 메서드를 가진 내장 인터페이스입니다. 예외 대신 오류 값을 반환합니다.
오류 반환
오류는 호출 체인을 따라 위로 전파됩니다. 각 단계에서 err != nil을 확인하고 처리합니다.
오류 메시지
fmt.Errorf로 포맷된 오류, errors.New로 단순 오류를 만듭니다. %w로 래핑할 수 있습니다.
errors.Is
errors.Is는 래핑 체인을 따라 일치 여부를 판단합니다. err == 비교보다 이쪽을 권장합니다.
errors.As
errors.As는 래핑 체인에서 지정한 타입의 오류를 찾아 추출합니다.
panic과 recover
panic은 goroutine을 중단시키고 recover는 defer 안에서만 동작합니다. 복구 불가능한 상황에서만 사용하세요.
defer에서 오류 처리
이름 있는 반환값을 사용하면 defer에서 반환값에 오류를 대입할 수 있습니다.
오류 결합
errors.Join은 여러 오류를 하나로 합칩니다. 다중 검증이나 작업 모음에 유용합니다.
12.입출력
파일 I/O, bufio, JSON, io.Reader/Writer를 다룹니다.
파일 읽기
작은 파일은 os.ReadFile로 통째로 읽습니다. 큰 파일은 os.Open + Reader(bufio.Scanner 등)로 스트리밍합니다.
파일 쓰기
os.WriteFile로 통째로 쓰고, os.OpenFile로 이어 붙이며, bufio.Writer로 버퍼링된 쓰기를 합니다.
JSON 직렬화
json.Marshal로 구조체를 JSON으로 인코딩합니다. 태그로 키 이름과 옵션을 제어합니다.
JSON 역직렬화
json.Unmarshal로 JSON을 구조체나 맵으로 디코딩합니다. 큰 데이터는 json.NewDecoder로 스트리밍합니다.
io.Reader / Writer
io.Reader/Writer는 스트림을 추상화합니다. io.ReadAll과 io.Copy가 자주 쓰이는 헬퍼입니다.
bufio 버퍼링
bufio는 버퍼링으로 시스템 콜을 줄입니다. Scanner로 줄 단위 처리가 쉽습니다.
표준 스트림
os.Stdin/Stdout/Stderr가 표준 스트림입니다. fmt.Scan과 bufio.Scanner로 입력을 처리합니다.
경로 조작
filepath로 플랫폼 독립적인 경로 처리를 합니다. Join, Dir, Base, Ext를 자주 사용합니다.
13.흔한 함정
Go 일상 개발에서 가장 자주 만나는 함정과 올바른 관용구를 소개합니다.
nil과 빈 슬라이스
nil 슬라이스와 빈 슬라이스는 다릅니다. JSON 직렬화 시 nil은 null, 빈 슬라이스는 []가 됩니다. 의도를 명확히 하세요.
루프 변수 캡처
Go 1.22 이전에는 루프 변수를 여러 goroutine이 공유했지만, 1.22부터는 매 반복마다 독립 변수가 됩니다.
map 순회 순서는 무작위
맵의 순회 순서는 무작위입니다. 안정적인 순서가 필요하면 키를 정렬해 순회하세요.
문자열 변경
문자열은 불변이므로 직접 수정할 수 없습니다. ASCII는 []byte로, 텍스트는 []rune으로 변환해 수정한 뒤 다시 문자열로 돌립니다.
슬라이스 복사와 공유
슬라이스를 대입하면 내부 배열을 공유합니다. 독립된 복사본은 copy로 만듭니다.
오류 무시
err을 무시하면 조용히 실패합니다. 반드시 처리하거나 로그를 남기거나, _에 대입해 의도를 보이세요.
리시버 불일치
같은 타입에서 값 리시버와 포인터 리시버가 섞이면 인터페이스 구현 등에서 미묘한 차이가 생깁니다. 한 가지로 통일하세요.
변수 섀도잉
내부 스코프에서 :=를 쓰면 새 변수가 만들어져 바깥 변수를 섀도잉합니다. 필요하면 명시적으로 =를 쓰세요.
루프 안의 defer
루프 안의 defer는 바깥 함수가 끝날 때까지 실행되지 않습니다. 각 반복을 함수로 감싸 자원을 즉시 해제하세요.
14.동시성
goroutine, 채널, select, 동시성 안전을 다룹니다.
goroutine
go 키워드로 동시 함수를 시작합니다. goroutine은 가볍고 스택이 동적으로 자랍니다. main이 끝나면 프로그램도 끝납니다.
channel
채널은 goroutine 간 통신 채널입니다. 버퍼가 없으면 송수신이 서로를 기다리며 동기적으로 블록합니다.
버퍼 채널
make(chan T, n)은 버퍼 채널을 만듭니다. 가득 차면 송신이, 비면 수신이 블록합니다.
select
select는 여러 채널 연산을 동시에 기다립니다. 준비된 case가 여러 개면 무작위로 하나를 선택하고 default는 즉시 실행됩니다.
WaitGroup
sync.WaitGroup으로 goroutine 묶음의 완료를 기다립니다. Add로 시작, defer Done으로 종료, Wait로 블록.
뮤텍스
sync.Mutex는 Lock/Unlock으로 공유 상태를 보호합니다. 읽기가 많다면 sync.RWMutex가 유리합니다.
sync.Once
sync.Once는 함수를 단 한 번만 실행하도록 보장합니다. 지연 싱글톤, 병렬 안전한 초기화에 적합합니다.
데이터 경쟁 탐지
go run -race(또는 go test -race)로 동기화되지 않은 동시 접근을 탐지합니다.
15.네트워크
HTTP 요청, 서버, context, TCP를 다룹니다.
HTTP GET
http.Get로 GET 요청을 보내고 defer로 resp.Body를 닫으며 상태 코드를 확인하세요.
HTTP 서버
http.HandleFunc로 핸들러를 등록하고 ListenAndServe로 대기합니다. *http.Server로 graceful shutdown을 구현하세요.
HTTP 클라이언트
http.Client로 타임아웃과 연결 풀을 설정하고, http.NewRequest로 메서드와 헤더, 본문을 자유롭게 구성합니다.
JSON API
JSON API 응답을 구조체에 디코딩하고, 태그로 필드 이름을 매핑합니다.
context
context는 취소와 데드라인을 전달합니다. WithTimeout/WithCancel로 자식 context를 만들고 I/O에 흘려보내세요.
URL 파싱
url.Parse로 URL을 분해하고 url.Values.Encode로 쿼리 문자열을 만듭니다.
TCP 소켓
net.Dial로 클라이언트 연결을 맺고 net.Listen으로 서버를 대기시킵니다. 연결은 바이트 스트림입니다.
라우터 강화
Go 1.22 이후 http.ServeMux는 메서드와 경로 매개변수({id})를 지원합니다.
16.시간과 날짜
time 패키지, Duration, 포맷팅, 시간대를 다룹니다.
현재 시각 얻기
time.Now로 현재 시각을 얻고 .UTC() / .In(loc)으로 시간대를 변환할 수 있습니다.
Duration
time.Duration은 나노초 단위의 정수입니다. time.Second 같은 상수와 함께 사용하고 더하기/빼기/슬립에 활용합니다.
포맷팅
Time.Format은 참조 시각 2006-01-02 15:04:05를 사용해 포맷 문자열을 기술합니다.
파싱
time.Parse는 같은 참조 레이아웃으로 문자열을 Time으로 변환합니다. 시간대가 있으면 ParseInLocation을 사용하세요.
Ticker
time.Ticker는 일정 간격으로 신호를 보냅니다. 사용이 끝나면 defer ticker.Stop()으로 자원을 해제하세요.
Sleep과 대기
time.Sleep은 현재 goroutine을 지정한 시간 동안 멈춥니다. 취소 가능한 대기는 Timer/After를 사용하세요.
Timer
time.Timer는 지정 시간 후 한 번만 발화합니다. Stop/Reset으로 제어하고 select와 함께 취소도 가능합니다.
시간대
IANA 시간대는 time.LoadLocation으로 불러오고 .In(loc)으로 적용합니다. time.FixedZone으로 고정 오프셋도 만들 수 있습니다.
17.프로세스와 환경
명령줄 인자, 환경 변수, 서브프로세스, 종료 코드를 다룹니다.
명령줄 인자
os.Args는 명령줄 인자의 슬라이스입니다. os.Args[0]은 프로그램 경로, 나머지가 사용자 인자입니다.
flag 파싱
flag 패키지로 명령줄 플래그를 파싱합니다. 기본값을 지정하고 Parse 후 값을 읽습니다.
환경 변수
os.Getenv로 읽고 os.Setenv로 설정합니다. os.LookupEnv는 미설정과 빈 문자열을 구분합니다.
종료 코드
os.Exit은 지정한 종료 코드로 즉시 종료합니다. 0이 성공, 그 외는 실패입니다. defer는 실행되지 않습니다.
서브프로세스 실행
exec.Command로 외부 명령을 실행하고, stdout/stderr를 캡처하거나 stdin을 연결하거나 환경 변수를 설정할 수 있습니다.
시그널 처리
signal.Notify로 OS 시그널을 채널로 받아 처리합니다. SIGINT/SIGTERM을 잡아 graceful shutdown을 구현하세요.
파일 시스템
MkdirAll로 디렉터리 생성, RemoveAll로 트리 삭제, Rename으로 이동, Stat으로 정보를 얻습니다.
작업 디렉터리
os.Getwd로 현재 작업 디렉터리를 얻고, os.Chdir로 변경합니다. 절대 경로는 filepath.Abs를 사용하세요.
18.정규식
regexp 패키지: 컴파일, 매칭, 찾기, 치환, 캡처 그룹을 다룹니다.
컴파일
regexp.Compile은 오류를 반환하고 regexp.MustCompile은 실패 시 패닉합니다. 패키지 스코프 정의에 적합합니다.
매칭 판단
MatchString은 문자열 매칭, Match는 []byte 매칭을 판단합니다. 완전 일치에는 ^...$를 씁니다.
찾기
FindString는 첫 매치를, FindStringIndex는 시작/끝 바이트 위치를 반환합니다.
모든 매치
FindAllString으로 모든 매치를 얻습니다. -1(또는 생략)은 무제한이고, 정수로 개수를 제한합니다.
치환
ReplaceAllString로 모든 매치를 치환합니다. 캡처 그룹은 $1, $2로 참조할 수 있습니다.
분할
re.Split로 정규식 패턴을 기준으로 문자열을 분할합니다. -1은 무제한입니다.
캡처 그룹
괄호는 서브매치를 캡처합니다. FindStringSubmatch로 얻고, (?P<name>) 형태의 이름 있는 그룹도 사용할 수 있습니다.
흔한 패턴
자주 쓰는 정규식(메일, URL, IP, 전화번호)과 핵심 문법(\d, \w, \s, 수량자, ^, $)을 정리합니다.
19.빌드와 테스트
빌드, 단위 테스트, 정적 분석, 크로스 플랫폼 컴파일을 다룹니다.
go build
go build로 패키지를 컴파일합니다. -o, -tags, -ldflags로 출력과 옵션을 제어할 수 있습니다.
단위 테스트
go test가 *_test.go 파일을 실행합니다. t.Error/t.Errorf는 비치명, t.Fatal/t.Fataliff는 해당 테스트를 중단합니다.
벤치마크
go test -bench는 Benchmark 함수를 실행합니다. 프레임워크가 b.N회를 루프 돌려 연산당 비용을 측정합니다.
정적 분석
go vet은 흔한 실수(printf 인자 불일치, 락 사용 오류 등)를 잡아냅니다. CI에서 반드시 실행하세요.
포맷팅
gofmt가 표준 포매터입니다. goimports를 함께 쓰면 임포트까지 자동 정리됩니다.
크로스 컴파일
GOOS와 GOARCH를 지정해 go build를 실행하면 크로스 컴파일할 수 있습니다. CGO 사용 시에는 대상용 C 도구 체인이 필요합니다.
경쟁 탐지
go build -race(또는 go test -race)로는 런타임 중 데이터 경쟁을 보고하도록 바이너리를 계측합니다.
모듈 버전
go.mod는 버전을 고정하고, go get은 업데이트, replace는 경로를 바꾸며, go.sum은 해시로 무결성을 검증합니다.
CI 통합
CI는 포맷 검사, go vet, go test -race -cover, 빌드, 아티팩트 배포 순으로 구성하는 것이 일반적입니다.
이 치트시트에 대해
이 페이지는 Go 1.22를 위한 자체 포함형 빠른 레퍼런스로, 언어 핵심과 실전 프로젝트에서 매일 쓰는 표준 라이브러리의 약 80%를 다룹니다. 짧은 변수 선언, 구조적 오류 처리(errors.Is / errors.As), 제네릭, 그리고 1.22부터 도입된 반복별 독립 루프 변수 같은 현대적 관용구를 중심으로 정리했습니다. 자세한 참고는 공식 Go 튜토리얼과 Effective Go를 보세요. 19개 섹션은 각각 하나의 주제에 집중합니다 — 첫 프로그램부터 goroutine, 인터페이스, 흔한 함정까지. 각 섹션은 8~14개의 짧은 소주제(각 5~20줄 코드)로 나뉘어 있으며, 총 150개 가량입니다. 코드 예제는 의도적으로 짧고 자기 설명적으로 작성되어 있습니다. 모든 처리는 브라우저 안에서 이루어집니다 — 업로드도 추적도 없습니다. 이 페이지는 GuruToolkit의 무료 개발자 도구 모음의 일부이며, 사용 가능한 코드는 자유롭게 활용할 수 있으나 어떠한 보증도 제공되지 않습니다.
버전 2.1.0