Go 콜렉션(Collections)
Go 배열(array), 슬라이스(slice), 맵(map)
배열(array)
컴파일시에 개수가 정해져 있어, 변경이 불가능한 것을 배열이라고 한다.
유형 앞에 [개수]
를 붙여 선언한다. 배열의 인덱스는 0부터 시작한다. 도중에 개수를 변경할 수는 없지만, 메모리 효율이나 성능면에서 뛰어나다.
package main
import "fmt"
func main() {
a1 := [3]string{}
a1[0] = "Red"
a1[1] = "Green"
a1[2] = "Blue"
fmt.Println(a1[0], a1[1], a1[2])
}
실행 결과:
Red Green Blue
초기화 시 값을 설정할 수도 있다.
a1 := [3]string{"Red", "Green", "Blue"}
초기화에 의해 개수가 결정되는 경우는 개수를 ...
으로 표기할 수 있고, 아예 생략할 수도 있다.
a1 := [...]string{"Red", "Green", "Blue"}
a1 := []string{"Red", "Green", "Blue"}
슬라이스(slice)
메모리 효율이나 속도는 약간 떨어지만, 개수를 변경 가능한 것을 슬라이스라고 부른다.
형식 이름 앞에 []
를 붙여 선언한다. 슬라이스에는 append()
를 사용하여 요소를 추가한다.
package main
import "fmt"
func main() {
a1 := []string{} // 슬라이스. 개수를 정하지 않음.
a1 = append(a1, "Red")
a1 = append(a1, "Green")
a1 = append(a1, "Blue")
fmt.Println(a1[0], a1[1], a1[2])
}
실행 결과:
Red Green Blue
len()
은 배열과 슬라이스의 길이(length), cap()
는 용량(capacity)을 구한다.
길이는 실제로 사용되는 수이고 용량은 메모리에 예약된 수이다.
용량을 초과하면 두 배의 메모리가 별도로 확보되고 기존 데이터가 복사된다.
package main
import "fmt"
func main() {
a := []int{}
for i := 0; i < 10; i++ {
a = append(a, i)
fmt.Println(len(a), cap(a))
}
}
실행 결과:
1 1
2 2
3 4
4 4
5 8
6 8
7 8
8 8
9 16
10 16
슬라이스의 경우, make(슬라이스형, 초기 개수, 초기 용량)
를 이용한 메모리 확보가 가능하다.
초기 용량을 생략하면 초기 개수와 동일한 용량이 확보된다. 용량을 미리 확보해 두는 것으로, 용량 초과시의 재확보를 줄여 속도를 빠르게 할 수 있다.
bufa := make([]byte, 0, 1024)
맵(map)
map[키 유형]
값 유형을 사용하여, 연관 배열과 같은 맵을 사용할 수 있다.
package main
import "fmt"
func main() {
// 맵 정의
a1 := map[string]int{
"x": 100,
"y": 200, // 개행하는 경우 쉼표 필수
}
// 맵을 참조한다.
fmt.Println(a1["x"])
// 맵에 요소 추가한다.
a1["z"] = 300
// 맵의 요소를 삭제한다.
delete(a1, "z")
// 맵의 길이를 구한다.
fmt.Println(len(a1))
// 맵에 요소가 있는지 확인한다.
_, ok := a1["z"]
if ok {
fmt.Println("Exist")
} else {
fmt.Println("Not exist")
}
// 맵 루프 처리
for key, value := range a1 {
fmt.Printf("%s=%d\n", key, value)
}
}
실행 결과:
100
2
Not exist
x=100
y=200
최종 수정 : 2023-03-26