- 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)
}
}
'Programming Language > 🐿️ Go (Golang)' 카테고리의 다른 글
Go의 기초 문법 (4) : array, map (0) | 2021.05.14 |
---|---|
Go의 기초 문법 (3) : 포인터와 역참조 (0) | 2021.05.14 |
Go의 기초 문법 (1) : 변수, iota, 함수, 타입, underlying type,... (0) | 2021.05.14 |
Go 설치 (0) | 2021.05.14 |
Go 패키지 & Go 모듈 (0) | 2021.05.13 |