기초
package main
import "fmt"
func main() {
//슬라이스(길이 & 용량 개념)
//슬라이스 배열과 같지만 크기가 동적 할당 가능
//배열 vs 슬라이스 차이점 중요
//길이 고정 vs 길이 가변
//값 타입 vs 참조 타입(레퍼런스)
//복사 전달 vs 참조 값 전달
//전체 비교연산자 사용 가능 vs 비교 연산자 사용 불가
//대 부분 슬라이스 사용한다.
//make(자료형, 길이, 용량(생략시 길이)) : 할당해야 값 삽입 가능
//예제1
var slice1 []int
slice2 := []int{}
slice3 := []int{1, 2, 3, 4, 5}
slice4 := [][]int{
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10}, //콤마 주의
}
//slice2[0] = 1 예외 발생
//slice3[4] = 10 //값 수정 가능
fmt.Printf("%-5T %d %d %v\n", slice1, len(slice1), cap(slice1), slice1)
fmt.Printf("%-5T %d %d %v\n", slice2, len(slice2), cap(slice2), slice2)
fmt.Printf("%-5T %d %d %v\n", slice3, len(slice3), cap(slice3), slice3)
fmt.Printf("%-5T %d %d %v\n", slice4, len(slice4), cap(slice4), slice4)
fmt.Println()
//예제2
var slice5 []int = make([]int, 5) // cap을 미리 지정
var slice6 = make([]int, 5)
slice7 := make([]int, 5, 10)
slice8 := make([]int, 5)
slice6[2] = 7 //삽입
fmt.Printf("%-5T %d %d %v\n", slice5, len(slice5), cap(slice5), slice5)
fmt.Printf("%-5T %d %d %v\n", slice6, len(slice6), cap(slice6), slice6)
fmt.Printf("%-5T %d %d %v\n", slice7, len(slice7), cap(slice7), slice7)
fmt.Printf("%-5T %d %d %v\n", slice8, len(slice8), cap(slice8), slice8) //길이와 용량 같다.
fmt.Println()
//예제3
var slice9 []int //nil 슬라이스 (길이와 용량 0)
if slice9 == nil {
fmt.Println("This is Nil Slice.")
}
}
package main
import "fmt"
func main() {
//슬라이스(슬라이스 참조 타입 증명)
//예제1(배열)
arr1 := [3]int{1, 2, 3}
var arr2 [3]int
arr2 = arr1
arr2[0] = 7
fmt.Println("ex1 : ", arr1)
fmt.Println("ex1 : ", arr2)
fmt.Println()
//예제2(슬라이스)
slice1 := []int{1, 2, 3}
var slice2 []int
slice2 = slice1
slice2[0] = 7
fmt.Println("ex2 : ", slice1)
fmt.Println("ex2 : ", slice2)
fmt.Println()
//예제3(슬라이스 예외 상황)
slice3 := make([]int, 5, 10)
fmt.Println("ex3 : ", slice3[4])
//fmt.Println("ex3 : ", slice3[5]) //길이 index over 예외
//fmt.Println("ex3 : ", slice3[8]) //길이 index over 예외
fmt.Println()
//예제4(슬라이스 순회)
for i, v := range arr1 {
fmt.Println("ex4 : ", i, v)
}
}
고급
//자료형 : 슬라이스 심화(1)
package main
import "fmt"
func main() {
//슬라이스 추가 및 병합
//예제1
s1 := []int{1, 2, 3, 4, 5}
s2 := []int{8, 9, 10, 11, 12}
s3 := []int{13, 14, 15, 16, 17}
s1 = append(s1, 6, 7)
s2 = append(s1, s2...) //슬라이스를 삽입 할 경우 ... 사용
s3 = append(s2, s3[0:3]...) //추출 후 병합
fmt.Println("ex1 : ", s1)
fmt.Println("ex1 : ", s2)
fmt.Println("ex1 : ", s3)
fmt.Println()
//예제2
s4 := make([]int, 0, 5)
for i := 0; i < 15; i++ {
s4 = append(s4, i)
fmt.Printf("ex2 -> len: %d, cap: %d, value: %v\n", len(s4), cap(s4), s4) //길이 및 용량 자동 증가(용량 : 2배)
}
}
package main
import "fmt"
import "sort"
func main() {
//슬라이스 추출 및 정렬
//slice[i:j] s -> j-1 까지 추출
//slice[i:] i -> 마지막 까지 추출
//slice[:j] 처음 -> j-1 까지 추출
//slice[:] 처음부터 마지막 까지 추출
//예제1(추출)
slice1 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fmt.Println("ex1 : ", slice1[:])
fmt.Println("ex1 : ", slice1[0:])
fmt.Println("ex1 : ", slice1[:5])
fmt.Println("ex1 : ", slice1[0:len(slice1)])
fmt.Println("ex1 : ", slice1[3:])
fmt.Println("ex1 : ", slice1[:3])
fmt.Println("ex1 : ", slice1[1:3])
fmt.Println()
//예제2(정렬)
//sort 패키지 : https://golang.org/pkg/sort/ 참조
slice2 := []int{3, 6, 10, 9, 1, 4, 5, 8, 2, 7}
slice3 := []string{"b", "d", "f", "a", "c", "e"}
fmt.Println("ex2 : ", sort.IntsAreSorted(slice2))
sort.Ints(slice2)
fmt.Println("ex2 : ", slice2) //Int형 정렬
fmt.Println("ex2 : ", sort.IntsAreSorted(slice2))
fmt.Println()
fmt.Println("ex2 : ", sort.StringsAreSorted(slice3))
sort.Strings(slice3)
fmt.Println("ex2 : ", slice3) //String형 정렬
fmt.Println("ex2 : ", sort.StringsAreSorted(slice3))
}
//자료형 : 슬라이스 심화(3)
package main
import "fmt"
func main() {
//슬라이스 복사
//copy(복사 대상, 원본)
//make로 공간을 할당 후 복사 해야한다.
//복사 된 슬라이스 값 변경해도 원본에는 영향 없음
//예제1(복사)
slice1 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
slice2 := make([]int, 5)
slice3 := []int{}
copy(slice2, slice1)
copy(slice3, slice1)
fmt.Println("ex1 : ", slice2)
fmt.Println("ex1 : ", slice3) //복사 안됨
fmt.Println()
//예제2
a := []int{1, 2, 3, 4, 5}
b := make([]int, 5)
copy(b, a)
b[0] = 7
b[4] = 10
fmt.Println("ex2 : ", a) //원본 유지
fmt.Println("ex2 : ", b) //복사 된 대상 변경
fmt.Println()
//예제3
c := [5]int{1, 2, 3, 4, 5}
d := c[0:3] //주의! 부분적으로 슬라이스 추출은 참조 -> 원본 값 변경 된다.
d[1] = 7
fmt.Println("ex3 : ", c)
fmt.Println("ex3 : ", d)
fmt.Println()
//예제4
e := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
f := e[0:5:7] //용량 지정
fmt.Println("ex4 : ", len(f), cap(f))
fmt.Println("ex4 : ", f)
}