블록, 섀도, 제어 구조
패키지 블록
파일 블록
함수 블록
유니버스 블록
package main
import "fmt"
func main() {
x := 10
if x > 5 {
fmt.Println(x)
x := 5
fmt.Println(x)
}
fmt.Println(x)
}
10
5
10
package main
import (
"fmt"
"math/rand"
)
func main() {
if n := rand.Intn(10); n == 0 {
fmt.Println("That's too low")
} else if n > 5 {
fmt.Println("That's too big:", n)
} else {
fmt.Println("That's a good number:", n)
}
fmt.Println(n) //n을 선언한 if문 밖이라 출력안됨.
}
package main
import "fmt"
func main() {
for i := 0; i < 10; i++ {
fmt.Println(i)
}
}
변수 선언 i := 0;
조건 i < 10;
=> 조건 맞으면, 실행 fmt.Println(i)
실행 후 i++
1) 선언부는 한 번만 실행
2) 조건부가 참일 경우에만 for 블록 실행, 거짓이면 for 문 종료
3) 증감부는 for 블록 실행이 끝나고 다시 2)으로 가기전에 실행
package main
import "fmt"
func main() {
evenVals := []int{2, 4, 6, 8, 10, 12}
for i, v := range evenVals {
fmt.Println(i, v)
}
}
만약 for 문에서 1개만 받을경우 (i) 인덱스만 출력됨. 위와같이 2개 받는 경우 인덱스와 슬라이스 값이 함께출력됨. (결과는 아래와 같음)
0 2
1 4
2 6
3 8
4 10
5 12
cf.) Go에서는 반환되는 값을 사용할 의도나 필요가 없다면 _(underscore)로 받는다. (Python과 같은 개념)
package main
import "fmt"
func main() {
evenVals := []int{2, 4, 6, 8, 10, 12}
for _, v := range evenVals {
fmt.Println(i, v)
}
}
package main
import (
"fmt"
)
func main() {
m := map[string]int{
"a": 1,
"c": 3,
"b": 2,
}
for i := 0; i < 3; i++ {
fmt.Println("Loop", i)
for k, v := range m {
fmt.Println(k, v)
}
}
}
문자열을 for-range 순회
for-range의 값은 복사본
[SYNTAX]
switch [selector] {
case value|condition:
문장1
문장2
...
case
case
}
함수
1급 객체
main 함수
함수 선언
1) func 키워드
2) 함수 이름
3) 입력 파라미터: 반드시 타입 명시 (Go는 정적 언어)
4) 반환값의 타입
⇒ 함수의 시그니처
return 키워드
여러 입력 파라미터가 같은 타입이라면 콤마로 파라미터를 구별하고 타입은 마지막에 기술할 수 있다.
base int, vals - 파라미터
vals - 가변 파라미터
함수 정의시 반환값의 타입을 콤마로 구분하고 괄호로 묶어준다
return 시 반환값을 괄호로 묶지 않는다
일반적으로 다중 반환값을 받을 때는 := 사용
type opFuncType func(int, int) int
이게 더 간결하긴 함 (show에 할당한 경우)
(클로저는 아님. 함수를 1급 객체로 사용)
package main
import "fmt"
func makeMult(base int) func(int) int {
//int형을 받고(base) int 반환
return func(factor int) int {
return base * factor
}
}
//내부함수가 외부변수(base)사용해서 return -> closure
// makeMult 함수가 끝나고 사라져도 base는 메모리에 있음. ->closure 때문에.외부변수를 계속 접근 할 수 있게 되는.
func main() {
twoBase := makeMult(2)
threeBase := makeMult(3)
for i := 0; i < 3; i++ { //factor가 됨
fmt.Println(twoBase(i), threeBase(i))
}
}
기타
파일 블록 > 패키지 블록 > 함수 블록
식별자 ; 이름 붙이는 거 캐멀케이스, 뭐 이런거..
파이썬에서 클로저는 데코레이터 할 때 쓰임