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