이동-슬라이스
Go Slice는 Go Array에 대한 추상화입니다. Go Array를 사용하면 동일한 종류의 여러 데이터 항목을 보유 할 수있는 변수를 정의 할 수 있지만 동적으로 크기를 늘리거나 자체 하위 배열을 가져 오는 내장 된 방법을 제공하지 않습니다. 슬라이스는이 한계를 극복합니다. Array에 필요한 많은 유틸리티 기능을 제공하며 Go 프로그래밍에서 널리 사용됩니다.
슬라이스 정의
슬라이스를 정의하려면 크기를 지정하지 않고 배열로 선언 할 수 있습니다. 또는 다음을 사용할 수 있습니다.make 슬라이스를 만드는 함수.
var numbers []int /* a slice of unspecified size */
/* numbers == []int{0,0,0,0,0}*/
numbers = make([]int,5,5) /* a slice of length 5 and capacity 5*/
len () 및 cap () 함수
슬라이스는 배열에 대한 추상화입니다. 실제로 배열을 기본 구조로 사용합니다. 그만큼len() 함수는 슬라이스에있는 요소를 반환합니다. cap()함수는 슬라이스의 용량 (즉, 수용 할 수있는 요소 수)을 반환합니다. 다음 예제는 슬라이스의 사용법을 설명합니다-
package main
import "fmt"
func main() {
var numbers = make([]int,3,5)
printSlice(numbers)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
len = 3 cap = 5 slice = [0 0 0]
무 슬라이스
슬라이스가 입력없이 선언되면 기본적으로 nil로 초기화됩니다. 길이와 용량은 0입니다. 예를 들면-
package main
import "fmt"
func main() {
var numbers []int
printSlice(numbers)
if(numbers == nil){
fmt.Printf("slice is nil")
}
}
func printSlice(x []int){
fmt.Printf("len = %d cap = %d slice = %v\n", len(x), cap(x),x)
}
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
len = 0 cap = 0 slice = []
slice is nil
서브 슬라이싱
Slice를 사용하면 하위 경계 및 상위 경계를 지정하여 하위 경계를 얻을 수 있습니다.[lower-bound:upper-bound]. 예를 들면-
package main
import "fmt"
func main() {
/* create a slice */
numbers := []int{0,1,2,3,4,5,6,7,8}
printSlice(numbers)
/* print the original slice */
fmt.Println("numbers ==", numbers)
/* print the sub slice starting from index 1(included) to index 4(excluded)*/
fmt.Println("numbers[1:4] ==", numbers[1:4])
/* missing lower bound implies 0*/
fmt.Println("numbers[:3] ==", numbers[:3])
/* missing upper bound implies len(s)*/
fmt.Println("numbers[4:] ==", numbers[4:])
numbers1 := make([]int,0,5)
printSlice(numbers1)
/* print the sub slice starting from index 0(included) to index 2(excluded) */
number2 := numbers[:2]
printSlice(number2)
/* print the sub slice starting from index 2(included) to index 5(excluded) */
number3 := numbers[2:5]
printSlice(number3)
}
func printSlice(x []int){
fmt.Printf("len = %d cap = %d slice = %v\n", len(x), cap(x),x)
}
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
len = 9 cap = 9 slice = [0 1 2 3 4 5 6 7 8]
numbers == [0 1 2 3 4 5 6 7 8]
numbers[1:4] == [1 2 3]
numbers[:3] == [0 1 2]
numbers[4:] == [4 5 6 7 8]
len = 0 cap = 5 slice = []
len = 2 cap = 9 slice = [0 1]
len = 3 cap = 7 slice = [2 3 4]
append () 및 copy () 함수
다음을 사용하여 슬라이스의 용량을 늘릴 수 있습니다. append()함수. 사용copy()함수를 사용하면 소스 슬라이스의 내용이 대상 슬라이스로 복사됩니다. 예를 들면-
package main
import "fmt"
func main() {
var numbers []int
printSlice(numbers)
/* append allows nil slice */
numbers = append(numbers, 0)
printSlice(numbers)
/* add one element to slice*/
numbers = append(numbers, 1)
printSlice(numbers)
/* add more than one element at a time*/
numbers = append(numbers, 2,3,4)
printSlice(numbers)
/* create a slice numbers1 with double the capacity of earlier slice*/
numbers1 := make([]int, len(numbers), (cap(numbers))*2)
/* copy content of numbers to numbers1 */
copy(numbers1,numbers)
printSlice(numbers1)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
len = 0 cap = 0 slice = []
len = 1 cap = 2 slice = [0]
len = 2 cap = 2 slice = [0 1]
len = 5 cap = 8 slice = [0 1 2 3 4]
len = 5 cap = 16 slice = [0 1 2 3 4]