[Golang] 조건문과 반복문
이 글은 https://golangbyexample.com/understand-if-else-statement-golang/, https://golangbyexample.com/switch-statement-golang/, https://golangbyexample.com/for-loop-in-golang/ 을 번역 및 재가공하여 작성하였습니다.
목차
1. 조건문
1-1. 기본문법
package main
import "fmt"
func main() {
age := 29
if age < 18 {
fmt.Println("청소년")
} else if age >= 18 && age < 40 {
fmt.Println("청년")
} else {
fmt.Println("노년")
}
}
다른 언어를 경험했던 분들에게 Go의 if문은 특별할 것이 별로 없습니다.
조건문에 괄호가 없고, boolean으로 치환되는 연산자만 사용할 수 있습니다.
JS의 경우 0, 빈문자열 등이 조건문에서 boolean로 판정이 됩니다.
이는 편리할 때도 있지만 예상치 못한 버그를 일으킬 때도 있었습니다.
이미 JS식 조건문에 익숙한 사용자에게는 불편할 수도 있을 것 같습니다.
1-2. 변수 선언과 동시에 사용하는 조건문
package main
import "fmt"
func main() {
if a := 1; a > 5 {
fmt.Println(a) // 1
fmt.Println("a는 5보다 크다")
} else {
fmt.Println(a) // 1
fmt.Println("a는 5보다 작다")
}
fmt.Println(a) // ERROR!!
}
조건문에서 변수를 선언할 수 있습니다.
이 변수는 if/else구문 내부에서 참조할 수 있는 변수입니다.
1-3. 삼항연산자
Go 언어는 문법을 단순화하기 위해 삼항연산자를 넣지 않았습니다.
확실히 코드를 이해하기 힘들게 하는 원인 중에 삼항연산자가 있는 것은 사실입니다.
다른 언어에서 삼항연산자를 쓰면 코드를 짧게 만들 수 있어서 즐겨썼던지라 저에게 Go 언어는 장황하게 느껴집니다.
같은 로직이라도 스크롤이 길어지니 오히려 알아보기 힘들다는 인상을 받았습니다.
2. Switch
2-1. 기본문법
package main
import "fmt"
func main() {
// switch 문장; 표현식 {
// ...
// }
switch ch := "b"; ch {
case "a":
fmt.Println("a")
case "b", "c":
fmt.Println("b or c")
default:
fmt.Println("No matching character")
}
//fmt.Println(ch)
}
- 문장은 짧은 선언, 함수 호출과 같은 모든 문이 올 수 있습니다.
- if문과 마찬가지로 ch는 switch문 안에서만 사용할 수 있습니다.
- 여러 case를 가질 수 있습니다.
- case는 여러 표현식을 가질 수 있습니다.
- 두 case는 같은 값을 가질 수 없습니다.
- break를 사용하지 않아도 정지하지만 작성해도 상관없습니다.
- 표현식이 없는 경우 case의 값은 boolean이 됩니다.
- fallthrough키워드로 다음 case문이 연속하여 실행됩니다.
2-2. switch문에 문장만 있는 경우(세미콜론 필수)
package main
import "fmt"
func main() {
switch age := 45; {
case age < 18:
fmt.Println("Kid")
case age >= 18 && age < 40:
fmt.Println("Young")
default:
fmt.Println("Old")
}
}
2-3. switch문에 표현식만 있는 경우
package main
import "fmt"
func main() {
gender := "man"
switch gender {
case "man":
fmt.Println("man")
case "woman":
fmt.Println("woman")
default:
fmt.Println("etc")
}
}
2-4. switch문에 문장과 표현식 모두 없는 경우
package main
import "fmt"
func main() {
age := 45
switch {
case age < 18:
fmt.Println("Kid")
case age >= 18 && age < 40:
fmt.Println("Young")
default:
fmt.Println("Old")
}
}
2-5. fallthrough 키워드
package main
import "fmt"
func main() {
i := 45
switch {
case i < 10:
fmt.Println("i is less than 10")
fallthrough
case i < 50:
fmt.Println("i is less than 50")
fallthrough
case i < 100:
fmt.Println("i is less than 100")
}
}
i is less than 50
i is less than 100
2-6. type switch
package main
import "fmt"
func main() {
printType("test_string")
printType(2)
}
func printType(t interface{}) {
switch v := t.(type) {
case string:
fmt.Println("Type: string")
case int:
fmt.Println("Type: int")
default:
fmt.Printf("Unknown Type %T", v)
}
}
Type: string
Type: int
변수.(type)을 표현식에 넣는 것으로 타입별 분기를 넣을 수 있습니다.
3. 반복문
3-1. for문 기본형식
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
fmt.Println(i)
}
}
고전적인 for문 입니다.
3-2. range
package main
import "fmt"
func main() {
letters := []string{"a", "b", "c"}
fmt.Println("인덱스와 값이 있는 경우")
for i, letter := range letters {
fmt.Printf("Index: %d Value:%s\n", i, letter)
}
fmt.Println("\n값만 있는 경우")
for _, letter := range letters {
fmt.Printf("Value: %s\n", letter)
}
fmt.Println("\n인덱스만 있는 경우")
for i := range letters {
fmt.Printf("Index: %d\n", i)
}
// 인덱스와 값이 없으면 letters의 size만큼 실행됨.
fmt.Println("\n인덱스와 값이 없는 경우")
i := 0
for range letters {
fmt.Printf("Index: %d Value: %s\n", i, letters[i])
i++
}
}
현대적?인 for문입니다.
배열의 인덱스와 값을 바로 가져올 수 있습니다.
인덱스를 사용하지 않는 경우 언더바(_)를 적어주어야 합니다.
3-3. while
func main() {
i := 0
for i < 5 {
fmt.Println(i)
i++
}
}
사실 Go언어에서는 while문이 없습니다.
대신 조건문만 넣어서 같은 동작을 할 수 있습니다.
3-4. 무한 루프
package main
import (
"fmt"
)
func main() {
i := 0
for {
i++
if i % 2 == 0 {
continue
}
fmt.Println(i)
if i >= 5 {
break
}
}
}
1
3
5
표현식을 아무것도 넣지 않으면 무한루프가 됩니다.
break로 빠져나올 수 있습니다.
continue로 다음 반복으로 뛰어넘습니다.
3-5. init 함수
package main
import "fmt"
func main() {
i := 1
//Function call in the init part in for loop
for test(); i < 3; i++ {
fmt.Println(i)
}
}
func test() {
fmt.Println("In test function")
}
In test function
1
2
for 조건 첫 번째 구문에 함수를 넣어 최초 한 번만 실행할 수 있습니다.