inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

쉽고 빠르게 끝내는 GO언어 프로그래밍 핵심 기초 입문 과정

슬라이스 고급

용량 관련 질문 드립니다.

281

kium

작성한 질문수 78

0

[3]번째 용량이 6이 되는게 궁금합니다.

지정한 용량이 넘을때는 2배가 되는데 계산대로 라면 

2의 2배인 4가 넘으니깐 4의 두배인 8이 되지 않나요? 

답변 부탁 드립니다.

var s []int
printSlice(s)
fmt.Println()

s = append(s, 0) <- 1번
printSlice(s)
fmt.Println()

s = append(s, 1) <- 2번
printSlice(s)
fmt.Println()

s = append(s, 2, 3, 4) <- 3번
printSlice(s)
fmt.Println()


func printSlice(s []int) {
fmt.Printf("mem=%p len=%d cap=%d %v", s, len(s), cap(s), s)
}


mem=0x0 len=0 cap=0 []
mem=0xc000090000 len=1 cap=1 [0]
mem=0xc00008c020 len=2 cap=2 [0 1]
mem=0xc0000a0000 len=5 cap=6 [0 1 2 3 4]

go

답변 3

1

좋은사람

append 를 사용하셔서 그렇습니다.

make 함수를 이용해서 초기화 후 사용하세요.

아래 링크에 정확하게 나와 있습니다.

https://velog.io/@kimmachinegun/Go-Slice-%EC%A7%91%EC%A4%91-%ED%83%90%EA%B5%AC-t2jn1kd1gc

append 함수를 사용할 때 주의해야 할 것이 있습니다. 위에서 말씀드린 것처럼 slice는 내부적으로 길이와 용량 값을 갖고 있는데, append 함수는 용량 값에 따라 다르게 동작합니다.

만약 slice의 용량이 새로운 요소들을 추가하기 충분하다면 append 함수는 배열을 재할당할 필요 없이 내부배열을 공유하고 길이가 다른 slice를 생성할 것입니다. 하지만 용량이 충분하지 않다면, append 함수는 상황에 따라 최적화 된 용량을 가진 slice를 생성합니다. 이렇게 생성된 slice는 기존 slice와 내부 배열을 공유하지 않습니다.

    a := make([]int, 3, 4) // len: 3 cap: 4인 slice 생성
    a[0] = 10
    a[1] = 20
    a[2] = 30

    b := append(a, 40) // a에 여분의 용량이 남으므로 내부배열 공유
    c := append(a, 50) // a에 여분의 용량이 남으므로 내부배열 공유
    d := append(c, 60) // c에 여분의 용량이 남지 않으므로 새로운 내부배열 할당

    fmt.Println(a, len(a), cap(a)) // [10 20 30] 3 4 
    fmt.Println(b, len(b), cap(b)) // [10 20 30 50] 4 4
    fmt.Println(c, len(c), cap(c)) // [10 20 30 50] 4 4
    fmt.Println(d, len(d), cap(d)) // [10 20 30 50 60] 5 8

0

좋은사람

네!! 열심히 하시네요 좋습니다.

이 부분이 핵심이네요.

append 함수는 상황에 따라 최적화 된 용량을 가진 slice를 생성합니다. 

0

kium

답변 감사합니다.^^

고 인터페이스 관련

0

69

2

Join함수 사용이유가 궁금합니다

0

54

1

vscode 설정

0

126

2

arm64

0

202

2

undefined 에러 : UndeclaredImportedName

0

343

1

godoc 에러 관련

0

207

1

package is not in std 오류

0

986

1

맵 예제 코드가 바이러스 검사에 걸려요

0

234

1

for 반복문에서 break와 continue 차이점

0

224

1

후치연산 관련 질문입니다.

0

197

1

package관리에 질문이 있습니다.

0

282

1

go channel 에제에서 질문이 있습니다.

0

194

1

golang 질문

0

310

1

재귀 함수 관련하여 질문이 있습니다.

0

346

1

atom 서비스 종료 관련

0

403

1

vscode 환경설정 업데이트 부탁드립니다

1

405

2

waitGroup.Done을 지연 시키는 방식

0

450

1

첫 번째 예제 질문있습니다.

0

264

1

2개씩 체크가 되는 이유가 궁금합니다.

0

328

1

go 표준 코드 컨벤션이 있나요?

0

826

1

slice에서 make 궁금한 게 있습니다.

1

262

1

import 관리는 어떻게 하나요?

0

317

1

개발환경설정 질문드립니다.

0

487

1

이것도 closure인가요?

0

240

1