Quick Syntax
if err != nil {
return err
}
for i := 0; i < len(items); i++ {
fmt.Println(items[i])
}
for count < limit {
count++
}
for _, item := range items {
fmt.Println(item)
}
for i := range 3 { // Go 1.22+
fmt.Println(i)
}
for {
break
}
switch status {
case http.StatusOK:
return nil
default:
return fmt.Errorf("bad status: %d", status)
}
switch {
case score >= 90:
return "A"
}Go 흐름 제어는 분기, 조건 반복, collection 순회, 값 분류를 먼저 나눠서 봅니다.
문법
if는 괄호 없이 조건을 쓴다
if count > 0 {
return count
}조건 앞에 짧은 statement를 둘 수 있습니다. 이때 선언한 변수는 if와 else 블록 안에서만 보입니다.
if err := save(); err != nil {
return err
}Go의 반복은 for 하나로 한다
for i := 0; i < 3; i++ {
fmt.Println(i)
}조건만 두면 다른 언어의 while처럼 읽습니다.
for count < limit {
count++
}무한 루프는 조건 없이 씁니다.
for {
work()
}collection 순회는 range
for index, value := range items {
fmt.Println(index, value)
}인덱스가 필요 없으면 _로 버립니다.
for _, value := range items {
fmt.Println(value)
}slice나 배열을 수정하려면 value가 아니라 index로 다시 접근합니다. range의 value는 요소 복사본이기 때문입니다.
for i := range scores {
scores[i] *= 2
}map 순회 순서는 정해져 있지 않습니다. string을 range하면 index는 byte 위치이고 value는 rune입니다. Go 1.22 이상 언어 버전에서는 for i := range 3처럼 정수 횟수 반복도 쓸 수 있지만, 프로젝트의 go.mod 언어 버전이 낮으면 사용할 수 없습니다.
break와 continue는 현재 반복을 제어한다
break는 가장 안쪽 for 또는 switch를 끝내고, continue는 가장 안쪽 for의 다음 반복으로 넘어갑니다. 중첩 반복을 한 번에 빠져나가야 할 때만 label을 붙입니다.
outer:
for _, row := range grid {
for _, value := range row {
if value == target {
break outer
}
}
}분기
값에 따라 분기한다
switch method {
case http.MethodGet:
return read()
case http.MethodPost:
return create()
default:
return errors.New("unsupported method")
}Go의 switch는 기본으로 다음 case로 자동 fallthrough하지 않습니다. 다음 case까지 이어 가려면 fallthrough를 명시해야 합니다.
조건식 없는 switch도 가능하다
switch {
case score >= 90:
return "A"
case score >= 80:
return "B"
default:
return "C"
}조건식 없는 switch는 여러 boolean 조건을 위에서부터 평가하는 구조입니다.
선택 기준
| 상황 | 먼저 떠올릴 선택 |
|---|---|
| 에러 처리나 단일 조건 | if |
| 인덱스가 필요한 반복 | for i := ... |
| slice/map/string 순회 | for range |
| 조건이 유지되는 동안 반복 | 조건만 있는 for |
| 값 종류별 분기 | switch value |
| 여러 조건을 순서대로 검사 | 조건식 없는 switch |
주의할 점
range에서 받는 value는 각 요소의 복사값입니다. 요소 자체를 수정해야 하면 인덱스로 접근해야 합니다. 또한 Go switch는 자동 fallthrough가 없으므로, 다른 언어의 switch처럼 다음 case가 이어진다고 가정하면 안 됩니다.
참고 링크
3 sources