Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie append() in der Go-Sprache

So verwenden Sie append() in der Go-Sprache

青灯夜游
青灯夜游Original
2023-01-18 15:31:363425Durchsuche

In der Go-Sprache wird die Funktion append() verwendet, um Elemente dynamisch zu einem Slice hinzuzufügen. Sie können Elemente am Ende des Slice hinzufügen und das Ergebnis zurückgeben. Beim Aufruf der Append-Funktion müssen Sie die ursprüngliche Slice-Variable verwenden Um den Rückgabewert zu erhalten, können Sie die Anweisung „slice = append(slice,elem2)“ verwenden.

So verwenden Sie append() in der Go-Sprache

Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer.

Die integrierte Funktion append() der Go-Sprache kann dynamisch Elemente zu einem Slice hinzufügen.

Wichtige Punkte:

  • append() wird verwendet, um Elemente am Ende des Slice hinzuzufügen und das Ergebnis zurückzugeben.
  • Beim Aufrufen der Append-Funktion müssen Sie die ursprüngliche Slice-Variableverwenden, um den Rückgabewert zu erhalten
  • an Append-Elemente anhängen. Wenn das Slice noch Kapazität hat, werden die neuen Elemente im verbleibenden Raum hinter dem platziert Wenn die zugrunde liegenden Daten nicht zusammengestellt werden können, erstellt Go ein neues zugrunde liegendes Array, um das Slice zu speichern, und die Slice-Adresse ändert sich ebenfalls entsprechend.
  • Kopieren Sie nach dem Zuweisen einer neuen Adresse die Elemente im ursprünglichen Slice einzeln in das neue Slice und kehren Sie zurück.

(1) append() hängt ein Element an

slice = append(slice,elem1,elem2)

append Innerhalb der Klammern können nach dem ersten Parameter-Slice mehrere Parameter hinzugefügt werden.

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增加两倍
}

Ausgabeergebnis:

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

(2)append() hängt ein Slice an

slice = append(slice,anotherSlice...)

append In den Klammern dürfen nur zwei Parameter stehen, ein Slice und das andere angehängte Slice.

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))
}

Ausgabeergebnis:

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

(3) Bei der Verwendung von make zum Erstellen eines Slice ist es ein häufiger Fehler, Elemente mit append() hinzuzufügen

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))
	} 
}

Ausgabeergebnis:

[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

Hinweis:

(1) make erstellt ein Slice mit Die Standardlänge hat einen Standardwert.

append() fügt Elemente nach dem Standardwert hinzu, anstatt den Standardwert zu überschreiben.

(2) Wenn das Element die beim Erstellen von Make festgelegte Kapazität von 10 überschreitet und die ursprüngliche untere Ebene nicht zusammengesetzt werden kann, wird eine neue fortlaufende Adresse zum Speichern des Elements verwendet.

(4) Verwenden Sie „Append“, um Elemente zu löschen.

Go bietet keine Funktion zum gezielten Löschen von Elementen. Stattdessen werden Elemente über die Eigenschaften des Slice selbst gelöscht.

Das heißt, Sie nehmen das gelöschte Element als Trennpunkt und verwenden dann „Anhängen“, um die Erinnerung an die beiden Teile davor und danach wieder zu verbinden.

Zum Beispiel:

Wenn Sie ein Element in Slice s löschen möchten, ist der Index des gelöschten Elements index

Dann ist der Löschvorgang

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

Verbinden Sie die beiden Teile vorher und nachher wieder, was im Wesentlichen darauf hinausläuft Löschen Sie den Punkt. Elemente werden nach vorne verschoben, der Speicher wird wieder verbunden.

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)
}

Das Prinzip der Verwendung von „append“ zum Löschen von Elementen in Go lautet:

(Die Zeichnung ist hässlich ...)

So verwenden Sie append() in der Go-Sprache

Ausgabeergebnis:

[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]

Nachdem Sie es verstanden haben, können Sie versuchen, die folgende Programmausgabe zu erraten lautet:

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)
}

So verwenden Sie append() in der Go-Sprache

Richtiges Ergebnis:

[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]

[Verwandte Empfehlungen: Go-Video-Tutorial, Programmierunterricht]

Das obige ist der detaillierte Inhalt vonSo verwenden Sie append() in der Go-Sprache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn