(Go : basic) 8. 슬라이스

Posted by : at

Category : Go


기초

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)
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links