// Map은 키(Key)에 대응하는 값(Value)을 신속히 찾는 해시테이블(Hash table)을 구현한 자료구조
// "map[Key타입]Value타입" 과 같이 선언
var idMap map[int]string
/*
이때 선언된 변수 idMap은 (map은 reference 타입이므로) nil 값을 갖으며,
이를 Nil Map이라 부른다.
Nil map에는 어떤 데이타를 쓸 수 없는데, map을 초기화하기 위해 make()함수를 사용할 수 있다
(map 리터럴을 사용할 수도 있는 이는 아래 참조).
*/
idMap = make(map[int]string)
/*
map은 make() 함수를 써서 초기화할 수도 있지만,
리터럴(literal)을 사용해 초기화할 수도 있다.
리터럴 초기화는 "map[Key타입]Value타입 { key:value }" 와 같이
Map 타입 뒤 { } 괄호 안에 "키: 값" 들을 열거하면 된다.
*/
//리터럴을 사용한 초기화
tickers := map[string]string{
"GOOG": "Google Inc",
"MSFT": "Microsoft",
"FB": "FaceBook",
}
package main
func main() {
var m map[int]string
m = make(map[int]string)
//추가 혹은 갱신
m[901] = "Apple"
m[134] = "Grape"
m[777] = "Tomato"
// 키에 대한 값 읽기
str := m[134]
println(str)
noData := m[999] // 값이 없으면 nil 혹은 zero 리턴
println(noData)
// 삭제
delete(m, 777)
}
/*
map을 사용하는 경우 종종 map안에 특정 키가 존재하는지를 체크할 필요가 있다.
이를 위해 Go에선 "map변수[키]" 읽기를 수행할 때 2개의 리턴값을 리턴한다.
첫번째는 키에 상응하는 값이고, 두번째는 그 키가 존재하는지 아닌지를 나타내는 bool 값이다.
즉, 아래 예제에서 val, exists := tickers["MSFT"] 의 val 에는 Microsoft라는 값이 리턴되고,
변수 exists에는 키가 존재하므로 true가 리턴된다.
*/
package main
func main() {
tickers := map[string]string{
"GOOG": "Google Inc",
"MSFT": "Microsoft",
"FB": "FaceBook",
"AMZN": "Amazon",
}
// map 키 체크
val, exists := tickers["MSFT"]
if !exists {
println("No MSFT ticker")
}
}
package main
import "fmt"
func main() {
myMap := map[string]string{
"A": "Apple",
"B": "Banana",
"C": "Charlie",
}
// for range 문을 사용하여 모든 맵 요소 출력
// Map은 unordered 이므로 순서는 무작위
for key, val := range myMap {
fmt.Println(key, val)
}
}