Slice

like array, but something different.
reference type.

declare slice

var $NAME []$TYPE

allocate space

var $NAME []$TYPE = make([]$TYPE, $SIZE)
var $NAME []$TYPE = make([]$TYPE, $SIZE, $CAPACITY)
$NAME := make([]$TYPE, $SIZE)
$NAME := make([]$TYPE, $SIZE, $CAPACITY)

capacity를 생략하면 size와 동일하게 생성됨.
size를 넘어서 추가될 데이터에 대비해 미리 메모리 공간 확보를 위함.
size만큼의 공간은 0으로 초기화되어 생성됨.

set values

append

append values to slice

a := []int{1, 2, 3, 4, 5}
a = append(a, 6, 7)
fmt.Println(a)  // [1 2 3 4 5 6 7]

append slice to slice

추가할 요소이름 뒤에 ...를 붙여서 슬라이스임을 나타냄.

a := []int{1, 2}
b := []int{3, 4}

a = append(a, b...)

fmt.Println(c)  // [1, 2, 3, 4]

copy

slice는 reference type이라 단순히 대입하면 주소값을 가져가게 됨.

copy($COPIED_SLICE, $ORIGIN_SLICE)

원본보다 복사할 슬라이스의 크기가 작은 경우 복사될 슬라이스의 크기만큼 복사됨.

참고
https://blog.golang.org/go-slices-usage-and-internals