Golang의 `append()` 함수는 언제 새 슬라이스를 할당합니까?

Patricia Arquette
풀어 주다: 2024-11-02 03:27:30
원래의
166명이 탐색했습니다.

When Does Golang's `append()` Function Allocate a New Slice?

Golang Append()는 언제 새 슬라이스를 생성합니까?

내장 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!