가장 빨리 만나는 Go 언어 Unit 22.5 부분 슬라이스 만들기

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

슬라이스 사용하기

이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07

부분 슬라이스 만들기

슬라이스는 기존 슬라이스에서 일정 위치를 지정하여 부분 슬라이스를 만들 수 있습니다.

  • 슬라이스[시작_인덱스:끝_인덱스]
a := []int{1, 2, 3, 4, 5}

b := a[0:5]    // a의 인덱스 0부터 5까지 참조

fmt.Println(a) // [1 2 3 4 5]
fmt.Println(b) // [1 2 3 4 5]
실행 결과
[1 2 3 4 5]
[1 2 3 4 5]

부분 슬라이스는 슬라이스의 시작 인덱스부터 끝 인덱스까지 일부만 참조합니다. 여기서 끝 인덱스는 실제 인덱스보다 1이 더 많습니다. 따라서 길이가 5인 슬라이스를 처음부터 끝까지 모두 참조하려면 [0:4]가 아닌 [0:5]가 됩니다. 또한, 부분 슬라이스를 만들더라도 슬라이스의 요소는 복사되지 않으므로 부분 슬라이스의 내용을 바꾸면 기존 슬라이스의 내용도 바뀝니다.

다음은 시작 인덱스와 끝 인덱스를 설정하여 일부만 참조하였습니다.

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

fmt.Println(a[0:3]) // [1 2 3]
fmt.Println(a[1:3]) // [2 3]
fmt.Println(a[2:5]) // [3 4 5]
실행 결과
[1 2 3]
[2 3]
[3 4 5]

부분 슬라이스를 생성할 때 시작 인덱스와 끝 인덱스는 생략할 수 있습니다. 시작 인덱스를 생략하면 0으로 지정되고, 끝 인덱스를 생략하면 슬라이스의 길이가 들어갑니다.

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

fmt.Println(a[:])        // [1 2 3 4 5]
fmt.Println(a[0:])       // [1 2 3 4 5]
fmt.Println(a[:5])       // [1 2 3 4 5]
fmt.Println(a[0:len(a)]) // [1 2 3 4 5]

fmt.Println(a[3:])       // [4 5]
fmt.Println(a[:3])       // [1 2 3]
fmt.Println(a[1:3])      // [2 3]
실행 결과
[1 2 3 4 5]
[1 2 3 4 5]
[1 2 3 4 5]
[1 2 3 4 5]
[4 5]
[1 2 3]
[2 3]

이 부분 슬라이스는 슬라이스뿐만 아니라 배열에도 사용할 수 있습니다. 물론 참조이기 때문에 배열이라도 부분 슬라이스의 요소를 바꾸면 배열의 요소도 바뀝니다.

a := [5]int{1, 2, 3, 4, 5} // 배열 선언

b := a[:2]     // 배열 a의 일부를 부분 슬라이스로 참조
b[0] = 9       // 부분 슬라이스는 참조이므로 a[0], b[0]의 값이 모두 바뀜

fmt.Println(a) // [9 2 3 4 5]
fmt.Println(b) // [9 2]
실행 결과
[9 2 3 4 5]
[9 2]

부분 슬라이스를 만들면서 용량도 함께 지정할 수 있습니다.

  • 슬라이스[시작_인덱스:끝_인덱스:용량]
a := []int{1, 2, 3, 4, 5, 6, 7, 8}

b := a[0:6:8] // 인덱스 0부터 6까지 가져와서 부분 슬라이스로 만들고 용량을 8로 설정

fmt.Println(len(b), cap(b)) // 6 8: 길이가 6이며 용량이 8인 슬라이스
fmt.Println(b)              // [1 2 3 4 5 6]
실행 결과
6 8
[1 2 3 4 5 6]

인덱스 0부터 인덱스 6까지 가져와서 부분 슬라이스를 만들지만 용량은 8로 설정합니다. 단 용량을 설정할 때 기존 슬라이스의 용량을 넘을 수는 없습니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

2015-06-01