티스토리 뷰

개발/GO

[Golang] 조건문과 반복문

피클s 2022. 3. 23. 10:55

이 글은 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 조건 첫 번째 구문에 함수를 넣어 최초 한 번만 실행할 수 있습니다.

'개발 > GO' 카테고리의 다른 글

[Golang] defer  (0) 2022.04.04
[Golang] 전략(Strategy) 패턴  (0) 2022.04.01
[Golang] 함수 정의  (0) 2022.03.31
[Golang] Constant 정수 선언  (0) 2022.03.13
[Golang] Variables 변수 선언  (0) 2022.03.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함