본문으로 바로가기

- for

forEacth, for in, for of, map... 과 같은 메서드가 없다

While도 없다. Go는 오로지 for 하나만으로 반복문을 구사한다.

 

가장 간단한 형태의 for문이다. 익숙하다.

func main() {
	for i := 0; i < 10; i++ {
		fmt.Println(i)
	}
}

 

while 처럼 동작하려면 다음과 같이 작성해주면 된다. 이렇듯, while의 역할도 for문으로 대체할 수 있다.

func main() {
	n := 2

	for n < 100 {
		fmt.Printf("count %d\n", n)

		n *= 2
	}
}

 

무한 loop는 for에 조건을 달아주지 않으면 된다.

func main() {
	for {
		fmt.Printf("무한루프입니다.\n")
	}
}

 

이렇게 생략이 가능하다보니 다음과 같은 독특한 형태의 이중 for문을 구성할 수도 있다. 

구구단이다 ㅎ

func main() {
	a := 2
	b := 1
	for {
		for {
			fmt.Printf("%d * %d = %d\n", a, b, a * b)
			b++
			if b == 10 {
				break // 안쪽 for문 종료
			}
		}
		b = 1
		a++
		if a == 10 {
			break // 외부 for문 종료
		}
	}
}

 

 

 

- range

위 for문을 range를 붙여 리팩토링하였다. python의 range와 비슷하면서도 다르다.

배열의 index를 반환한다.

func sumUp(numbers ...int) int {
	sum := 0
	// range를 붙여 array의 index를 iterate함. 즉, 0, 1, 2, 3, ... 꼴
	for index := range numbers {
		sum += numbers[index]
	}
	return sum
}

 

다시 리팩토링 하였다, _ 로 index를 무시하고 배열의 값을 반환하는 두번째 값을 이용하였다.

func sumUp(numbers ...int) int {
	sum := 0
	// 두번째 인자로 배열의 값을 차례대로 반환한다
	for _, number := range numbers {
		sum += number
	}
	return sum
}

 

만약 배열이 아닌 map을 range로 돌리게 된다면 index, value가 아닌 key, value를 받게 된다.

results := map[string]string{"google": "ok", "facebook", "ok"}

for url, result := range results {
	fmt.Println(url, result)
}

 

 

- if

간단한 if문으로 딱히 설명할 것이 없습니다.

하나 독특한 점은 if 조건 부분에서 0, 1을 사용할 수 없습니다. C언어와 C++는 조건식에 1, 0과 같은 숫자를 쓸 수 있는 것과 대조적입니다.

package main

import "fmt"

func canIDrink(age int) bool {
	if age >= 18 {
		return true
	}
	return false
}

func main() {
	fmt.Println(canIDrink(16))
}

 

 

특이하게 Go에서는 아래와 같이 if <expression> 부분에서 expression에 변수를 선언할 수 있습니다.

if문의 expression에서만 사용될 변수일 경우 이런 방식으로 사용하면 좀 더 간결한 코드를 작성할 수 있어서 종종 사용한다고 합니다.

주의점으론, expression에 의해 선언된 변수는 if문 내부에서만 사용될 수 있으며, if문 바깥에서는 사용할 수 없습니다.

package main

import "fmt"

func canIDrink(age int) bool {
	// if <expression> 부분에 koreanAge라는 변수 선언 후 활용 가능
	if koreanAge := age + 2; koreanAge >= 18 {
		return true
	}
	return false
}

func main() {
	fmt.Println(canIDrink(16))
}

 

 

 

- switch

break를 따로 입력하지 않아도 해당되는 case만 수행합니다. Go의 장점 중 하나입니다!

func amITen(age int) bool {
	switch {
	case age == 10:
		return true
	case age != 10:
		return false
	}
	return false
}

func main() {
	fmt.Println(amITen(16))
}

 

switch <expression> 부분에 사용할 변수를 정의할 수도 있습니다.

func amITen(age int) bool {
	switch koreanAge := age + 2; koreanAge {
	case 10:
		return true
	}
	return false
}

func main() {
	fmt.Println(amITen(16))
}

 

break를 쓰지 않아도 되는 대신, 고의적으로 case를 통과 싶은 경우가 있을 수 있을겁니다 (저는 지금까지 없었습니다.)

이 경우에는 fallthrough를 입력해주면 됩니다. 아래 코드의 경우 case 2, 3, default까지 쭉 출력됩니다.

가급적 fallthrough는 사용하지 않길 권장합니다. 

package main

import "fmt"

func main() {
	a := 2

	switch a {
	case 1:
		fmt.Println("1임")
	case 2:
		fmt.Println("2임")
		fallthrough
	case 3:
		fmt.Println("3임")
		fallthrough
	default:
		fmt.Println("뭐임 ㅋㅋ")
	}
}

 

 

 

한편, switch는 iota 상수와 잘 결합합니다. 연속된 값으로 생성된 상수들의 케이스 핸들링이 쉽기 때문이죠!

아래 코드는 색깔에 iota가 붙어서 0, 1, 2 .. 꼴로 나옵니다. 이 값들을 스트링으로 변환하는 함수를 switch문으로 작성하겠습니다.

package main

import "fmt"

type ColorType int
const (
	Red ColorType = iota
	Blue 
	Green
	Yellow
)

func colorToString(color ColorType) string {
	switch color {
	case Red:
		return "Red"
	case Blue:
		return "Blue"
	case Green:
		return "Green"
	case Yellow:
		return "Yellow"
	default:
		return "what are you doing"

	}
}

func main() {
	fmt.Println(colorToString(Blue))
}

 

 

 

- 제어문 break, continue, goto

 

다른 언어랑 똑같습니다.

반복문을 탈출하는 break, 반복문의 첫부분으로 돌아가는 continue, 특정 부분으로 갈 수 있는 goto

goto는 사용을 지양할 것. goto문을 써야만 해결할 수 있는 문제 상황도 딱히 존재 하지 않습니다.

func main() {
	i := 0
	for {
		i++
		if i%2 != 0 {
			continue
		}
		if i == 8 {
			break
		}
		fmt.Println(i)
	}
}

 


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체