숏컷 코드
go
if err != nil {
return err
}
for i := 0; i < len(items); i++ {
fmt.Println(items[i])
}
for _, item := range items {
fmt.Println(item)
}
switch status {
case http.StatusOK:
return nil
default:
return fmt.Errorf("bad status: %d", status)
}Go 흐름 제어는 분기, 조건 반복, collection 순회, 값 분류를 먼저 나눠서 봅니다.
문법
if는 괄호 없이 조건을 쓴다
go
if count > 0 {
return count
}조건 앞에 짧은 statement를 둘 수 있습니다. 이때 선언한 변수는 if와 else 블록 안에서만 보입니다.
go
if err := save(); err != nil {
return err
}Go의 반복은 for 하나로 한다
go
for i := 0; i < 3; i++ {
fmt.Println(i)
}조건만 두면 다른 언어의 while처럼 읽습니다.
go
for count < limit {
count++
}무한 루프는 조건 없이 씁니다.
go
for {
work()
}collection 순회는 range
go
for index, value := range items {
fmt.Println(index, value)
}인덱스가 필요 없으면 _로 버립니다.
go
for _, value := range items {
fmt.Println(value)
}분기
값에 따라 분기한다
go
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도 가능하다
go
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