Go 언어에서는 add() 함수를 사용하여 슬라이스에 요소를 동적으로 추가하고 추가 함수를 호출할 때 결과를 반환할 수 있습니다. 원래 슬라이스 변수를 사용해야 합니다. 반환 값을 받으려면 "slice = append(slice,elem1,elem2)" 문을 사용하면 됩니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.
Go 언어의 내장 함수인 add()는 슬라이스에 요소를 동적으로 추가할 수 있습니다.
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
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
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 세트를 초과하고 원래 하단 레이어를 조립할 수 없는 경우 새로운 연속 주소를 사용하여 요소를 저장합니다.
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에서 추가를 사용하여 요소를 삭제하는 원리는 다음과 같습니다.
(그림이 못생겼네요...)
출력 결과:
[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) }
올바른 결과:
[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 중국어 웹사이트의 기타 관련 기사를 참조하세요!