Golang Syntax _4
15. 맵 (Maps)
package main import "fmt" type Vertex struct { Lat, Long float64 } var m = map[string]Vertex{ "Bell Labs": Vertex{ 40.68433, -74.39967, }, "Google": { 37.42202, -122.08408, }, } func main() { fmt.Println(t, m) // map[Bell Labs:{40.68433 -74.39967} Google:{37.42202 -122.08408}] }
- Go에서 맵은 값에 key를 지정한다.
- 맵은 반드시 사용하기 전에 make를 명시해아한다.
- make를 수행하지 않은 nil 에는 값을 할당할 수 없다.
- 만약 상위의 타입이 타입명이라면 리터럴에서 타입명을 생략해도 된다.
즉"Bell Labs": {40.68433, -74.39967}
와"Bell Labs": Vertex{40.68433, -74.39967}
는 같은 뜻이다. - 맵 다루기 >
맵의 요소를 생성/ 수정 :m[key] = data
요소값 가져오기 :val = m[key]
키 존재 여부 확인 :val, has_key = m[key]
>> 만약m[key]
가 존재하지 않는다면has_key
엔false
가,val
엔zero value
이 할당된다.
16. 연습문제
WordCount
함수를 구현합니다. 이 함수는s
라는 문자열 내에서 각각의 “단어”의 등장 횟수를 나타내는 맵을 반환해야 합니다.wc.Test
함수는 주어진 함수를 이용하여 테스트를 실행한 뒤에 그 성공 여부를 출력해 줍니다.
package main import ( "code.google.com/p/go-tour/wc" "strings" ) func WordCount(s string) map[string]int { m := make(map[string]int) for _, key := range strings.Fields(s) { _, ok := m[key] if ok { m[key]++ } else { m[key] = 1 } } return m } func main() { wc.Test(WordCount) }
17. 함수 값과 클로저
package main import "fmt" func adder() func(int) int { sum := 0 return func(x int) int { sum += x return sum } } func main() { pos, neg := adder(), adder() for i := 0; i < 10; i++ { fmt.Println( pos(i), neg(-2*i), ) } }
- Go에서 함수를 value(값)이다. 값이기 때문에 변수에 저장해 사용할 수 있다.
- 함수는 클로저(full closures)이다. 위 예제에서 보면 각각의 pos와 neg의 sum 변수가 존재하는 걸 볼 수있다.
18. 연습문제
fibonacci
함수를 구현합니다. 이 함수는 이어지는 피보나치 수를 반환하는 함수 (클로져)를 반환해야 합니다.
package main import "fmt" // fibonacci is a function that returns // a function that returns an int. func fibonacci() func() int { x1 := 1 x2 := 2 return func() int { x3 := x1+x2 x1, x2 = x2, x3 return x3 } } func main() { f := fibonacci() for i := 0; i < 10; i++ { fmt.Println(f()) } }