>  기사  >  백엔드 개발  >  Go 언어에서 Append()를 사용하는 방법

Go 언어에서 Append()를 사용하는 방법

青灯夜游
青灯夜游원래의
2023-01-18 15:31:363424검색

Go 언어에서는 add() 함수를 사용하여 슬라이스에 요소를 동적으로 추가하고 추가 함수를 호출할 때 결과를 반환할 수 있습니다. 원래 슬라이스 변수를 사용해야 합니다. 반환 값을 받으려면 "slice = append(slice,elem1,elem2)" 문을 사용하면 됩니다.

Go 언어에서 Append()를 사용하는 방법

이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.

Go 언어의 내장 함수인 add()는 슬라이스에 요소를 동적으로 추가할 수 있습니다.

핵심 사항:

  • append()는 슬라이스 끝에 요소를 추가하고 결과를 반환하는 데 사용됩니다.
  • append 함수를 호출할 때 원래 슬라이스 변수를 사용하여 반환 값을 받아야 합니다
  • 슬라이스에 여전히 capacity가 있는 경우 새 요소는 뒤에 남은 공간에 배치됩니다. 기본 데이터를 조립할 수 없는 경우 Go는 슬라이스를 저장하기 위해 새로운 기본 배열을 생성하고 그에 따라 슬라이스 주소도 변경됩니다.
  • 새 주소를 할당한 후 원래 슬라이스의 요소를 하나씩 새 슬라이스에 복사하고 돌아옵니다.

(1)append() 요소를 추가합니다.

slice = append(slice,elem1,elem2)

append 대괄호 내에서 첫 번째 매개변수 슬라이스 뒤에 여러 매개변수를 추가할 수 있습니다.

package  main
import "fmt"
//切片进阶操作
 
func main(){
	//append()为切片追加元素
	s1 := []string {"火鸡面","辛拉面","汤达人"}
	fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n",s1,len(s1),cap(s1))
	
	//调用append函数必须用原来的切片变量接收返回值
	s1 = append(s1,"小当家") //append追加元素,原来的底层数组装不下的时候,Go就会创建新的底层数组来保存这个切片
  fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n",s1,len(s1),cap(s1))//cap增加两倍
}

출력 결과:

s1=[火鸡面 辛拉面 汤达人] len(s1)=3 cap(s1)=3
s1=[火鸡面 辛拉面 汤达人 小当家] len(s1)=4 cap(s1)=6

(2)append()는 슬라이스를 추가합니다.

slice = append(slice,anotherSlice...)

append 대괄호에는 두 개의 매개변수만 있을 수 있습니다. 하나는 슬라이스이고 다른 하나는 추가된 슬라이스입니다.

package  main
import "fmt"
//切片进阶操作
 
func main(){
	//append()为切片追加元素
	s1 := []string {"火鸡面","辛拉面","汤达人"}
	fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n",s1,len(s1),cap(s1))
	
	//调用append函数必须用原来的切片变量接收返回值
	s1 = append(s1,"小当家") //append动态追加元素,原来的底层数组容纳不下足够多的元素时,切片就会开始扩容,Go底层数组就会把底层数组换一个
	fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n",s1,len(s1),cap(s1))

	//调用append添加一个切片
	s2 := []string{"脆司令","圣斗士"}
	s1 = append(s1,s2...)//...表示拆开切片,再添加
	fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d",s1,len(s1),cap(s1))
}

출력 결과:

s1=[火鸡面 辛拉面 汤达人] len(s1)=3 cap(s1)=3
s1=[火鸡面 辛拉面 汤达人 小当家] len(s1)=4 cap(s1)=6
s1=[火鸡面 辛拉面 汤达人 小当家 脆司令 圣斗士] len(s1)=6 cap(s1)=6

(3) make를 사용하여 슬라이스를 생성할 때 add()를 사용하여 요소를 추가하는 것은 흔한 실수입니다.

package main

import "fmt"

func main(){
	var a = make([]int, 5, 10)
	fmt.Println(a)
	fmt.Printf("%p\n",a)
	for i := 0; i <10; i++ {
		a = append(a,i)
    //%p 打印切片地址
		fmt.Printf("%v,%p,cap(a):%d\n",a,a,cap(a))
	} 
}

출력 결과:

[0 0 0 0 0]
0xc0000180a0
[0 0 0 0 0 0],0xc0000180a0,cap(a):10
[0 0 0 0 0 0 1],0xc0000180a0,cap(a):10
[0 0 0 0 0 0 1 2],0xc0000180a0,cap(a):10
[0 0 0 0 0 0 1 2 3],0xc0000180a0,cap(a):10
[0 0 0 0 0 0 1 2 3 4],0xc0000180a0,cap(a):10
[0 0 0 0 0 0 1 2 3 4 5],0xc00007c000,cap(a):20
[0 0 0 0 0 0 1 2 3 4 5 6],0xc00007c000,cap(a):20
[0 0 0 0 0 0 1 2 3 4 5 6 7],0xc00007c000,cap(a):20
[0 0 0 0 0 0 1 2 3 4 5 6 7 8],0xc00007c000,cap(a):20
[0 0 0 0 0 0 1 2 3 4 5 6 7 8 9],0xc00007c000,cap(a):20

참고:

(1) make는 기본 길이에 ​​기본값이 있는 슬라이스를 생성합니다.

append()는 기본값을 덮어쓰는 대신 기본값 뒤에 요소를 추가합니다.

(2) make 생성 시 요소가 용량 10 세트를 초과하고 원래 하단 레이어를 조립할 수 없는 경우 새로운 연속 주소를 사용하여 요소를 저장합니다.

(4) 추가를 사용하여 요소 삭제

Go에서는 요소를 구체적으로 삭제하는 기능을 제공하지 않으며 대신 슬라이스 자체의 특성을 통해 요소를 삭제합니다.

즉, 삭제된 요소를 분할 지점으로 삼은 다음 추가를 사용하여 메모리의 두 부분을 다시 연결합니다.

예를 들어:

슬라이스 s에서 요소를 삭제하려는 경우 삭제된 요소의 인덱스는 index

그런 다음 삭제 프로세스는

s = append ( s[ :index ], s[ index+1: ] )

전후의 두 부분을 다시 연결합니다. 이는 본질적으로 다음과 같습니다. 포인트 삭제 요소가 앞으로 이동하고 메모리가 다시 연결됩니다.

package main

import "fmt"

func main(){
	a1 := [...]int{1,2,5,3,78,9,4,9,23,32}
	s1 := a1[:] //得到切片
	fmt.Println(s1)

	//删除索引为4的78
	s1 = append(s1[:4],s1[5:]...)
	fmt.Println(s1)
	fmt.Println(a1)
}

Go에서 추가를 사용하여 요소를 삭제하는 원리는 다음과 같습니다.

(그림이 못생겼네요...)

Go 언어에서 Append()를 사용하는 방법

출력 결과:

[1 2 5 3 78 9 4 9 23 32]
[1 2 5 3 9 4 9 23 32]
[1 2 5 3 9 4 9 23 32 32]

이해한 후 다음 프로그램 출력을 추측해 볼 수 있습니다. is:

package main

import "fmt"

func main(){
	a1 := [...]int{1,2,5,3,78,9,4,9,23,32}
	s1 := a1[:] //得到切片
	fmt.Println(s1)

	//删掉索引为2和3的5,3
	s1 = append(s1[:2],s1[4:]...)
	fmt.Println(s1)
	fmt.Println(a1)
}

Go 언어에서 Append()를 사용하는 방법

올바른 결과:

[1 2 5 3 78 9 4 9 23 32]
[1 2 78 9 4 9 23 32]
[1 2 78 9 4 9 23 32 23 32]

[관련 권장 사항: Go 비디오 튜토리얼, 프로그래밍 교육]

위 내용은 Go 언어에서 Append()를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.