728x90

Golang에서는 Slice는 C++의 Vector와 Pointer를 섞은 듯한 느낌이다

각각의 선언방법 확인

// c++ array
int array[10]

// golang array
var array [10]int

// c++ vector
std::vector<int> vec;

// golang 
var slice []int

 

slice 사용 예제

// slice 선언 예
var slice []int // 크기가 0인 int형 slice
var slice []int{1,2,3} // [1,2,3]
var slice []int{1, 5:2, 10:3} // [1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 3]
var slice = make([]int, 3) // [0, 0, 0] 크기가 3인 int형 slice

// 주의사항
var array = [...]int{1,2,3} // 크기가 고정인 배열 선언
var slice = []int{1,2,3} // slice 선언

// slice 길이
sliceLen = len(slice)

// 슬라이스 순회
var slice = []int{1,2,3}
for i := 0; i < len(slice); ++i
{
    slice[i] += 10
}

// range를 이용하면 c++로 치면 tuple 처럼 값을 가져온다.
// i는 index
// v는 요소의 값
for i, v := range slice
{
    slice[i] = v * 2
}

// append 이용해서 값 추가
var slice = [int]{1,2,3}
slice = append(slice, 4)
slice2 := append(slice, 5, 6, 7)

// string의 값 바꾸기
var str string = "Hello World"
var slice []byte = []byte(str)

slice[2] = 'a' // == Healo World

 

슬라이스와 배열의 동작 차이

func changeArray(array2 [5]int)
{
    array2[2] = 200
}

func changeSlice(slice2 []int)
{
    slice2[2] = 200
}

func main()
{
    array := [5]int{1,2,3,4,5}
    slice := []int{1,2,3,4,5}
    
    changeArray(array)
    changeSlice(slice)
    
    fmt.Println("array:", array)    // {1, 2, 3, 4, 5}
    fmt.Println("slice:", slice)    // {1, 2, 200, 4, 5}
}

위 코드에서 결과를 보면 changeArray()는 값복사, changeSlice()는 주소 복사가 일어난 것을 알 수 있다.

 

- 출처 : Tucker의 Go 언어 프로그래밍

728x90

+ Recent posts