맵은 자바스크립트의 객체 리터널처럼 키와 값을 가질 수 있는 자료구조입니다.
맵을 사용하면 배열과 슬라이스를 사용했을때 거쳐야 할 일부 번거로운 연산과정을 거칠 필요 없이 키와 값이 매핑되어 있기 때문에 접근이나 값을 수정하는 것이 수월합니다.
Go 언어의 맵을 데이터가 들어간 순서대로 정렬되지 않는다는 특징이 있어서 정렬된 데이터를 원한다면 별도의 정렬 함수를 사용하여 정렬해야 합니다.
맵의 사용 방법은 아래와 같으며 슬라이스와 마찬가지로
make()를 통해 생성합니다. 아래의 맵은 키가 문자열(string)타입이며 값 또한 문자열(string)타입입니다.
package main
func main() {
var m map[string]string = make(map[string]string)
}
하지만 리터럴로 맵을 사용할 때는
make()를 사용할 필요가 없습니다.
package main
import "fmt"
func main() {
m := map[string]string{"sayHello":"Hello, Go!"}
/** Hello, Go! */
fmt.Println(m["sayHello"])
}
맵의 제로 값또한
nil이며,make()를 통해 생성하지 않고 맵 타임을 가진 변수만 선언해두면nil맵 입니다.값을 할당하지 않은 키에 접근해두더라도 해당 값의 타입에 해당하는 제로 값이 할당되기 때문에 안전합니다.
또한
nil맵에 대해 연산을 수행하면 빈 맵처럼 여기게 됩니다.
package main
import "fmt"
func main() {
var m map[string]string
/** -> true */
fmt.Println(m == nil)
m = map[string]string{"sayHello":"Hello, Go!"}
/** -> "" */
fmt.Printf("%#v", m["Java"])
}
맵에서 값을 추가하거나 삭제를 해보도록 하겠습니다.
연관 배열의 형태로 사용하게 되면 해당 키에 해당하는 값에 접근할 수 있으며, 빌트인 함수인
delete()함수를 사용하면 맵에서 특정키에 해당하는 값을 제거할 수있습니다.
package main
import "fmt"
func main() {
m := map[string]string{"sayHello":"Hello, Go!"}
m["Golang"] = "awesome"
/** -> [Golang:awesome, sayHello:Hello, Go!] */
fmt.Println(m)
delete(m, "Golang")
/** -> [sayHello:Hello, Go!] */
fmt.Println(m)
}
할당되지 않은 키에 접근하면 해당 값의 제로 값으로 설정됩니다. 하지만 맵에 존재하지 않는 키에 대해 다른 연산을 처리하고 싶다면 어떻게 해야할까?
키에 접근할 때, 키에 해당하는 값 이외에도 또 하나의 값을 반환하게 되는데, 그것을 사용하면 해당 키가 실제로 맵에 존재하는 것인지 알 수 있습니다.
아래의 코드는
Golang이라는 키가 존재할 경우 출력을 하도록 하는 코드인데, 일반적으로 키 체크에 대해서는 ok라는 변수 이름을 사용합니다.
package main
import "fmt"
func main() {
m := make(map[string]string)
if _, ok := m["Golang"]; ok {
fmt.Printf("%#v",m["Golang"])
} else {
/** -> Golang does not exist */
fmt.Println("Golang does not exist")
}
}
맵을 순회하는 것은 배열이나 슬라이스와 똑같이
for ~ range구문을 사용하면 됩니다.반복자에는 키와 값이 할당되며 다만 주의해야 할 점은 맵은 순서가 지정되어 있지 않기 때문에 무엇이 먼저 나올지 모른다는 것입니다.
아래의 코드를 보면 0,1,2,3,4 순서대로 출력될 것이라 예상하지만 사실 임의의 순서로 출력됩니다.
Go에서는 실행될 때마다 임의의 순서로 정해진다고 합니다.
package main
import "fmt"
func main() {
m := map[int]int{0:0,1:1,2:2,3:3,4:4}
for _, sum := range m {
fmt.Println(sum)
}
}
Go 언어 공부 GoGo~~! 엌ㅋㅋㅋㅋㅋㅋㅋ