오늘 정리할 내용은 맵(map)에 대한 내용이다.
맵은 슬라이스와 마찬가지로 참조 타입이다. 문법도 슬라이스와 유사하여 쉽게 공부할 수 있었다.
Go언어의 맵 기본 문법
Go언어의 맵은 Python언어의 딕셔너리와 매우 유사하다. nil map이라는 개념이 있다는 것이 유일한 차이점인 것 같다.
코드를 통해 nil map을 선언해보고, 선언과 동시에 초기화도 해보자.
package main
import "fmt"
func main() {
var dict1 map[string]string
if dict1 == nil {
fmt.Println("this is nil map")
}
dict2 := map[string]string{
"name": "주성민",
"age": "25",
"birth": "950906",
}
fmt.Printf("%s의 나이는 %s이고 생년월일은 %s 이다.\n", dict2["name"], dict2["age"], dict2["birth"])
fmt.Printf("현재 dict2의 길이는 %d 이다.\n", len(dict2))
fmt.Println(dict2)
}
"var dict1 map[string]string"는 nil map을 만드는 문법이다.
선언과 동시에 초기화하는 경우는 nil map이 아닌 데이터가 존재하는 map이 생성된다.
아래 코드처럼 nil map이 초기화된 map을 참조하게 할 수도 있다.
dict1 = dict2
fmt.Println(dict1)
결과는 직접 확인해보자!
슬라이스의 make 함수 처럼 맵 컬렉션에 메모리를 할당할 수 있다.
package main
import "fmt"
func main() {
var dict3 = make(map[int]string)
dict3[1] = "일"
dict3[5] = "오"
fmt.Println(dict3)
}
nil map이 아니기 때문에 할당된 메모리 영역에 key와 value를 정의할 수 있다.
이미 정의된 key, value가 있다면 key에 해당하는 새로운 value값으로 재정의도 가능하다.
Go언어 map의 key값 확인
시작하기에 앞서 이 문법은 정말정말정말 중요하다고 말하고 싶다.
나는 정말 별거아닌 줄 알고 대충 보고 넘겼었는데, 이번에 Go언어로 Open Source Project를 진행하다가 알게 되었다.
실제 프로젝트에 기여했던 코드 중 일부를 변형한 코드이다.
package main
import "fmt"
func main() {
var dict3 = make(map[int]string)
dict3[1] = "일"
dict3[5] = "오"
fmt.Println(dict3)
switch word, ok := dict3[1]; ok {
case true:
fmt.Printf("key에 해당하는 값은 %s 입니다.\n", word)
default:
fmt.Println("key에 해당하는 값이 없습니다.")
}
switch word, ok := dict3[10]; ok {
case true:
fmt.Printf("key에 해당하는 값은 %s 입니다.\n", word)
default:
fmt.Println("key에 해당하는 값이 없습니다.")
}
}
map을 이런식으로 사용하는 데는 다음과 같은 문법이 있다.
- 콘솔 출력 함수에 "맵이름[key]"을 바로 입력할 때는 key 값에 해당되는 value 값만 출력됩니다.
- value 값과 true/false 값을 반환받기 위해서는 변수 두 개를 선언한 후에 각각 할당받아야 합니다. 예를 들어 val, exist := 맵이름[key] 형식으로 입력해야만 val에는 value 값이, exist에는 true/false 값이 초기화됩니다.
- value 값만 반환받고 싶다면 변수 한 개만 선언해 할당받으면 됩니다. 예를 들어 val := 맵이름[key]형식으로 입력하면 val에 value 값이 초기화됩니다. 꼭 두 개의 값을 반환하는 것은 아닙니다.
- true/false 값만 반환받고 싶다면 "_, bool변수"형식으로 선언해 할당받으면 됩니다. 예를 들어 _, exist := 맵이름[key] 형식으로 입력하면 exist에 true/false 값이 초기화됩니다. 왜냐하면 '맵이름[key]'는 꼭 'value, true/false' 순서로 반환하기 때문입니다. 따라서 앞에 value 값을 받는 인자를 '_,' 용법을 써 생략한다면 true/false 값만 반환받을 수 있는 것입니다.
-출처 : 구름에듀 - 바로 실행해보면서 배우는 Go Lang 중 36강
마무리
짧지만 정말 많이 쓰이고 있는 Hash table인 맵에 대해 공부하였다.
파이썬에서 딕셔너리를 정말 유용하게 사용하듯이 Go에서도 유용하게 사용할 것 같다.
*구름 edu의 바로 실행해보면서 배우는 Go Lang"을 수강 후 정리한 내용입니다.
소스코드는 깃허브 저장소를 참고!
'Computer_Language > GO' 카테고리의 다른 글
[Go] 10. Go(golang)의 익명 함수(Anonymous function) (0) | 2019.11.01 |
---|---|
[Go] 9. Go(golang)의 함수(func) (0) | 2019.10.20 |
[Go] 7. Go(golang)의 배열과 슬라이스 (0) | 2019.10.01 |
[Go] 6. Go(golang)의 조건문과 분기문 (0) | 2019.09.27 |
[Go] 5. Go(golang)의 반복문 (0) | 2019.09.23 |