Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan append() dalam bahasa go

Cara menggunakan append() dalam bahasa go

青灯夜游
青灯夜游asal
2023-01-18 15:31:363405semak imbas

Dalam bahasa Go, fungsi append() digunakan untuk menambahkan elemen secara dinamik pada hirisan Anda boleh menambah elemen pada penghujung kepingan dan mengembalikan hasilnya apabila memanggil fungsi tambah, anda mesti gunakan pembolehubah hirisan asal untuk menerima nilai pulangan dan menambah elemen Anda boleh menggunakan pernyataan "slice = append(slice,elem1,elem2)" Untuk menambahkan slice, anda boleh menggunakan "slice = append(slice,anotherSlice. ..)" kenyataan.

Cara menggunakan append() dalam bahasa go

Persekitaran pengendalian tutorial ini: sistem Windows 7, GO versi 1.18, komputer Dell G3.

Fungsi terbina dalam bahasa Go append() boleh menambah elemen pada kepingan secara dinamik.

Isi penting:

  • append() digunakan untuk menambah elemen pada penghujung hirisan dan mengembalikan hasilnya.
  • Apabila memanggil fungsi tambah, anda mesti menggunakan pembolehubah hirisan asal untuk menerima nilai pulangan
  • tambah untuk menambah elemen jika hirisan masih mempunyai kapasiti , ia akan menjadi Elemen baharu diletakkan di ruang yang tinggal di belakang kepingan asal Apabila tatasusunan asas tidak dapat dipasang, Go akan mencipta tatasusunan asas baharu untuk menyimpan kepingan itu, dan alamat kepingan juga akan berubah dengan sewajarnya.
  • Selepas menetapkan alamat baharu, salin elemen dalam kepingan asal satu demi satu ke kepingan baharu dan kembalikan.

(1) append() menambahkan elemen

slice = append(slice,elem1,elem2)

Dalam kurungan tambahan, berbilang parameter boleh ditambah selepas kepingan parameter pertama.

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

Hasil keluaran:

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

(2)tambah() tambah hirisan

slice = append(slice,anotherSlice...)

Tambah kurungan hanya boleh Terdapat dua parameter, satu untuk kepingan dan satu lagi untuk kepingan yang dilampirkan.

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

Hasil keluaran:

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

(3) Apabila menggunakan make untuk mencipta kepingan, adalah kesilapan biasa untuk menambah elemen menggunakan append()

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

Hasil keluaran:

[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

Nota:

(1) membuat hirisan Jika terdapat panjang lalai, akan ada nilai lalai .

append() menambah elemen selepas nilai lalai, dan bukannya menimpa nilai lalai.

(2) Apabila elemen melebihi kapasiti 10 set apabila dicipta, dan nombor bawah asal tidak boleh dipasang, alamat berterusan baharu akan diganti untuk menyimpan elemen.

(4) Gunakan append untuk memadam elemen

Go tidak menyediakan fungsi untuk memadamkan elemen secara khusus, tetapi memadamkan elemen melalui ciri-ciri kepingan itu sendiri.

Iaitu, elemen yang dipadam digunakan sebagai titik pembahagi, dan tambah digunakan untuk menyambung semula memori dua bahagian sebelum dan selepas.

Contohnya :

Jika anda ingin memadamkan elemen dalam slice s, indeks elemen yang dipadam ialah indeks

, maka proses pemadaman ialah

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

Menyambung semula dua bahagian sebelum dan selepas pada asasnya menggerakkan elemen pada titik yang dipadamkan ke hadapan dan menyambung semula memori.

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

Prinsip penggunaan append untuk memadam elemen dalam Go ialah:

(Lukisan itu hodoh...)

Cara menggunakan append() dalam bahasa go

Hasil output:

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

Setelah memahami, anda boleh cuba meneka apakah output program berikut:

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

Cara menggunakan append() dalam bahasa go

Hasil yang betul :

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

[Cadangan berkaitan: Pergi tutorial video, Pengajaran pengaturcaraan]

Atas ialah kandungan terperinci Cara menggunakan append() dalam bahasa go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn