golang 기초 - 슬라이스

한나리·2023년 6월 26일

Go

목록 보기
4/19
post-thumbnail

슬라이스

// 슬라이스 선언
var s []int

// 슬라이스 초기화
var s []int = []int{1, 2, 3}
var s = make([]int, 3)

//슬라이스 읽기
s[0]

//슬라이스에 값 저장
s[0] = 10

package main

import (
	"fmt"
)    

func main() {
	s:= []int{1, 2, 3, 4, 5}
    fmt.Println(s) // [1 2 3 4 5]
    fmt.Printf("%T \n", s) //[]int
    
    s1 := make([]int, 10) //타입, 크기
    fmt.Println(s1) // [0 0 0 0 0 0 0 0 0 0]
    fmt.Printf("%T \n", s1) //[]int
    
   s1[0] = 1
   fmt.Println(s1) //[1 0 0 0 0 0 0 0 0 0]
   fmt.Println(s1[0]) //1
}

append

// 슬라이스에 값 추가
var s []int = []int{1, 2, 3}
s[4] = 4 // panic: runtime error: index out of range
s = append(s , 4)

package main

import (
	"fmt"
)    

func main() {
	s:= []int{1, 2, 3, 4, 5}
    s[4] = 1
    fmt.Println(s) // [1 2 3 4 1]
    
    s[5] = 6 // panic: runtime error: index out of range[5] with length 5
  	s = append(s, 7)
    fmt.Println(s) // [1 2 3 4 5 7]
}

cap - 용량

// cap - 용량 : 슬라이스에 할당된 메모리의 크기
var s []int = make([]int, 5, 10) //타입, 크기, 용량
fmt.Println(len(s)) // 5
fmt.Println(cap(s)) //10
fmt.Println(s) // [0 0 0 0 0]

append(s, 1)
fmt.Println(len(s)) // 6
fmt.Println(cap(s)) //10
fmt.Println(s) // [0 0 0 0 0 1]


t := make([]int, 5) //용량이 생략되었다면 크기와 동일한 값 할당
fmt.Println(cap(t)) //5 

u := make(uint[], 10, 10)
append(u, 1) //원래 크기를 넘어서면 지정된 용량 2배만큼으로 증가됨
fmt.Println(cap(u)) //20 

copy

sl1 := []int{1, 2, 3, 4, 5}
sl2 := make([]int, 5)

//슬라이드 값 복사
copy(sl2, sl1)
sl2[0] = 999
fmt.Println(sl1)
fmt.Println(sl2)

s1 := []int{1, 2, 3, 4, 5}
s2 := make([]int, 5)

copy(s2, s1)
fmt.Println(s2) // [1 2 3 4 5 0 0 0 0 0]

s1 := []int{1, 2, 3, 4, 5}
s2 := s1 //값 참조 복사

fmt.Println(s2) // [1 2 3 4 5]

s1 := []int{1, 2, 3, 4, 5}
s2 := s1 //값 참조 복사 (copy랑은 다름) 
s2[0] = 100

fmt.Println(s2) // [100 2 3 4 5]

s1 := []int{1, 2, 3, 4, 5}
s2 := make([]int, 5)
copy(s2, s1)
s2[0] = 100
fmt.Println(s1) [1 2 3 4 5]
fmt.Println(s2) // [100 2 3 4 5]

배열 슬라이싱

// 배열 슬라이싱
arr := [5]int{1 ,2, 3, 4, 5}
slice := arr [1:4] //시작인덱스 : 끝인덱스
fmt.Println(slice) // [2 3 4] 

// type check
fmt.Println(reflect.TypeOf(arr))
fmt.Println(reflect.TypeOf(slice))
fmt.Printf("%T \n", arr) //[5]int 정적배열
fmt.Printf("%T \n", slice) //[]int 동적배열

슬라이스 슬라이싱

// 슬라이스 슬라이싱
slice1 := []int{1 ,2, 3, 4, 5}
slice2 := slice1[1:4]  
slice3 := slice1[:4] //0부터 4 전까지
slice4 := slice1[1:3:5] //1에서 3전까지 가져온 후 cap을 4로 지정

fmt.Println(slice1) // [1 2 3 4 5] 
fmt.Println(slice2) // [2 3 4] 
fmt.Println(slice3) // [1 2 3 4] 
fmt.Println(slice4) // [2 3]
fmt.Println(cap(slice4)) // 4
profile
내가 떠나기 전까지는 망하지 마라, 블록체인 개발자

0개의 댓글