내장 API 문서와는 달리, add() 함수는 항상 새 슬라이스를 생성하지 않습니다. . 이는 원본 슬라이스의 용량과 추가할 요소 수에 따라 결정됩니다.
부울 조합이 반복적으로 생성되는 제공된 코드 조각에서 느낌표는 다음에서 채널로 전송된 슬라이스를 나타냅니다. AddOption 함수. 그러나 main()의 반대편에 나타나는 슬라이스는 수정됩니다.
슬라이스 데이터 유형과 내부 표현 간의 차이로 인해 혼란이 발생합니다. 슬라이스 설명자는 두 개의 정수(길이와 용량)와 기본 데이터에 대한 포인터로 구성됩니다. 따라서 추가()는 새로운 설명자를 포함하지만 데이터에 대한 포인터는 동일한 새 슬라이스를 반환합니다.
이 내용은 다음 코드 샘플에 설명되어 있습니다.
<code class="go">package main import "fmt" func main() { s := make([]int, 0, 5) // Create a slice with zero length and capacity 5 s = append(s, []int{1, 2, 3, 4}...) // Append a slice of integers a := append(s, 5) // Append one element (slice descriptor and data pointer remain the same) fmt.Println(a) b := append(s, 6) // Append one element (slice descriptor and data pointer remain the same) fmt.Println(b) fmt.Println(a) }</code>
출력:
[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 6]
이는 원본 슬라이스에 여전히 용량이 있기 때문에 a와 b가 모두 동일한 데이터 포인터를 공유한다는 것을 보여줍니다. 그러나 용량을 4로 줄이면 다음과 같습니다.
<code class="go">s := make([]int, 0, 4)</code>
출력은 다음과 같습니다.
[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 5]
원본 슬라이스에 더 이상 충분한 용량이 없기 때문에 추가()는 다음을 사용하여 새 슬라이스를 생성합니다. b에 대한 새로운 데이터 포인터
위 내용은 Golang의 `append()` 함수는 언제 새 슬라이스를 할당합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!