🔥 Map 리터럴과 값타입
Map을 선언할 때 지정한 값 타입이 타입명 하나로 이루어져 있다면, Map 리터럴의 요소에서 값의 타입명을 생략할 수 있습니다. 이렇게 하면 코드의 가독성이 높아지고, 타이핑 양도 줄일 수 있습니다.
하지만 값 타입이 타입명 하나로만 이루어지지 않은 경우도 있습니다. 예를 들어, Map의 값 타입이 포인터 타입이거나 배열, 슬라이스, Map 등의 복합 타입일 수 있습니다.
var m1 = map[string]*int{ "a": new(int), "b": new(int), } var m2 = map[string][]string{ "a": []string{"apple", "avocado"}, "b": []string{"banana", "blueberry"}, }
go
위의 예제에서 m1
의 값 타입은 *int
로 포인터 타입이며, m2
의 값 타입은 []string
로 슬라이스 타입입니다. 이런 경우에는 Map 리터럴의 요소에서 타입명을 생략할 수 없습니다.
이제 값 타입이 타입명 하나로 이루어진 경우의 예제 코드를 살펴보겠습니다:
package main import "fmt" type Vertex struct { Lat, Long float64 } var m = map[string]Vertex{ "Bell Labs": {40.68433, -74.39967}, "Google": {37.42202, -122.08408}, } func main() { fmt.Println(m) }
go
위 코드에서 Vertex
구조체를 정의하고 있습니다. 이 구조체는 Lat
과 Long
이라는 두 개의 float64
타입 필드를 가지고 있습니다.
type Vertex struct { Lat, Long float64 }
go
그리고 m
이라는 변수를 선언하면서 Map 리터럴을 사용하고 있습니다. 이 Map은 string
타입의 키와 Vertex
타입의 값을 가지고 있습니다.
var m = map[string]Vertex{ "Bell Labs": {40.68433, -74.39967}, "Google": {37.42202, -122.08408}, }
go
여기서 주목할 점은 Map 리터럴의 값 부분입니다. Vertex
타입을 명시하지 않고 중괄호 {}
만 사용하여 Lat
과 Long
값을 직접 지정하고 있습니다. 이렇게 할 수 있는 이유는 Map의 값 타입이 Vertex
로 이미 명시되어 있기 때문입니다.
마지막으로 main
함수에서는 fmt.Println(m)
을 호출하여 Map m
을 출력하고 있습니다.
func main() { fmt.Println(m) }
go
이 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다:
map[Bell Labs:{40.68433 -74.39967} Google:{37.42202 -122.08408}]
text
이렇게 Map 리터럴에서 값 타입을 생략하는 기능을 활용하면 코드를 더욱 간결하고 읽기 쉽게 작성할 수 있습니다. 특히 구조체와 같이 복잡한 타입을 값으로 사용할 때 유용합니다.