Go언어의 제어구조는 C와 연관성이 있지만, 중요한 점에서 차이가 있다. Go언어에서는 do나 while 반복문이 존재하지 않으며, 단지 좀 더 일반화된 for, 좀 더 유연한 switch가 존재한다. if와 switch는 선택적으로 for 와 같은 초기화 구문을 받을 수 있다.
break 와 continue 구문들은 선택적으로 어느 것을 멈추거나 계속할지 식별하기 위해 라벨을 받을 수 있다. 또한 타입 switch와 다방향 통신 멀티플랙서 select 의 새로운 제어 구조가 포함되어있다. 조건식에 괄호가 필요하지 않은 것이 특징이다
package iftest
import "fmt"
func If() bool {
test1 := 1
if test1 == 1 {
// 이런식으로 return 값을 해 줄수도 있다, 대신 함수에 return 타입 명시 필요
return true
} else {
fmt.Println("false")
}
}
if 문에서 조건식을 사용하기 이전에 간단한 문장(Optional Statement)를 함께 실행할 수 있다. var := i*2 라는 문장을 조건식 이전에 실행할 수 있는데 여기서 주의할 점은 이때 정의된 변수 val는 if문 scope 내에서만 사용할 수 있다. 이러한 Optional Statement 표현은 switch, for 문 등 Go의 여러 문법에서 통용된다.
package iftest
import (
"fmt"
"io/ioutil"
"os"
)
func If() {
// 파일 열기
f, err := os.Open("C:/te22st.txt")
if err != nil {
fmt.Println("파일 열기 오류:", err)
return
}
defer f.Close() // 함수가 끝나면 파일 닫기
// 파일의 내용을 읽기
content, err := ioutil.ReadAll(f)
if err != nil {
fmt.Println("파일 읽기 오류:", err)
return
}
// 파일 내용 출력
fmt.Println("파일 내용:", string(content))
}
Go패키지에서는 값과 에러를 둘 다 return 해주는 방식의 패키지가 많다. 때문에 가장 흔한 에러 처리 방법은 위와 같은 식으로 진행이 되면 될 것이다.
여러 값을 비교해야 하는 경우 혹우 다수의 조건식을 체크해야 하는 경우 switch문을 사용한다. 타 언어들과 비슷하게 switch 문 뒤에 변수(혹은 Expression)를 지정하고, case 문에 해당 변수가 가질 수 있는 값들을 지정해, 다른 블럭들을 실행할 수 있다.
package switchtest
import "fmt"
func Switchtest() {
test := 1.4
switch test {
case 0.5:
fmt.Println("1")
case 0.6:
fmt.Println("2")
default:
fmt.Println("3")
}
}
package switchtest
import "fmt"
func Switchtest() {
test := 1.4
// switch구문 뒤에 변수나 expression을 안두어도 된다
switch {
// case 구문 뒤에도 단순한 리터럴 값이 아니라 expression(표현식)이 가능
case test >= 0.5:
fmt.Println("1")
case test >= 0.6:
fmt.Println("2")
default:
fmt.Println("3")
}
}
package iftest
import "fmt"
func Switchtest() {
test := 1.4
switch {
case test >= 0.5:
fmt.Println("1")
fallthrough
case test >= 0.6:
// 여기 case 블록에는 fallthrough가 없으니 , 1 2 까지만 출력이 된다.
// 3도 출력을 하게 하고 싶으면, 아래에 fallthrough를 추가한다.
fmt.Println("2")
default:
fmt.Println("3")
}
}
package iftest
import (
"fmt"
"reflect"
)
func CheckType(arg any) any {
return reflect.TypeOf(arg)
}
func Switchtest() {
var test interface{} = CheckType('q')
switch test.(type) {
case int:
fmt.Println("int")
case string:
fmt.Println("string")
default:
fmt.Println("default")
}
}
Go 프로그래밍 언어에서 반복문은 for 루프를 이용한다. Go는 반복문에 while 이런건 존재하지않고 유일하게 for 하나만 존재한다. 구조는 다른어어와 유사하게 "for 초기값; 조건식; 증감 {...}" 의 형식을 따른다.
대신 타 언어 처럼 초기값, 조건식, 증감을 둘러싸는 괄호 ()는 생략된다. 또한 초기값은 병렬 할당이 가능하다. 증감또한 꼭 ++, -- 만 있는 것이 아니라 i = i + 2와 같이 표현식을 써줄수 도 있다
package forexample
import "fmt"
func Forexample() {
sum := 0
for i := 1; i < 11; i++ {
sum += i
}
fmt.Println(sum, "합계")
}
package forexample
import "fmt"
func Forexample() {
sum := 0
for x, y := 1, 3; x < 10; x , y = x+2, y+2 {
sum += x
sum -= y
}
fmt.Println("합계 = " ,sum)
}
Go에서 for루프는 초기값, 증감식이 생략이 가능하다. 조건식만을 사용할 수 있는ㄷ네, 이는 타 언어의 while 반복문과 유사하게 쓸 수 있도록 제공한다. 따라서 조건식에는 bool 타입이 와야한다.
package forexample
import "fmt"
func Forexample() {
sum := 0
i := 1
for i < 101 {
sum += i
i++
}
fmt.Println("합계 :", sum)
}
for 루프로 무한 루프를 만드려면 초기값, 조건식, 증감 모두를 생략 하면된다. 빠져나오기 위해서는 ctrl + c 를 누르거나, break를 써준다.
package forexample
import "fmt"
func Forexample() {
sum := 0
i := 1
for {
sum += i
i++
if i == 100 {
break
}
}
fmt.Println("합계 :", sum)
}
for range 문은 컬렉션으로 부터 한 요소(element)씩 가져와 차례로 for 블럭의 문장들을 실행한다. python의 for i in [list] 와 비슷할 것이고, js의 for of 와 비슷할 것이다.
for range 문은 "for index, ele := range 컬렉션" 과 같이 for 루프를 구성하는데, range 키워드 다음의 컬렉션으로부터 하나씩 요소를 리턴해서 그 요소의 위치인덱스와 값을 for 키워드 다음의 2개의 변수에 각각 할당한다.
package forexample
import "fmt"
func Forexample() {
sum := 0
name := []string{"김두한", "구마적", "쌍칼"}
for i, e := range name {
fmt.Println(i, " ",e)
}
}
//
0 김두한
1 구마적
2 쌍칼
경우에 따라 for 루프 내에서 즉시 빠져나올 필요가 있는데, 이 때 break 문을 사용한다. continue도 타 언어와 마찬가지로, 현재 실행 구문에서 for 루프 시작 부분으로 가려고 할 때, continue를 사용하고, 임의의 문장으로 이동하기 위해서는 goto문을 이용할 수 있다. goto문은 for 루프와 관련없이 사용될 수 있다.
break문은 for 루프 이외에 switch문이나 select문에서도 사용할 수 있다. 하지만, continue문은 for 루프와 연관되어 사용된다.
package forexample
import "fmt"
func Forexample() {
var a = 1
for a < 15 {
if a == 5 {
a += a
continue // for루프 시작으로
}
a++
if a > 10 {
break //루프 빠져나옴
}
}
if a == 11 {
goto END //goto 사용예
}
fmt.Println(a)
END:
fmt.Println("End")
}