Go言語でappend()を使う方法

青灯夜游
リリース: 2023-01-28 09:03:37
オリジナル
3331 人が閲覧しました

Go 言語では、要素をスライスに動的に追加するために append() 関数が使用されます。要素をスライスの最後に追加して結果を返すことができます。append 関数を呼び出すときは、次の関数を使用する必要があります。戻り値を受け取って要素を追加するには、元のスライス変数を使用します。「slice = append(slice,elem1,elem2)」ステートメントを使用できます。スライスを追加するには、「slice = append(slice,anotherSlice. ..)" 声明。

Go言語でappend()を使う方法

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

Go 言語の組み込み関数 append() は、要素をスライスに動的に追加できます。

ポイント:

  • append() は、スライス 末尾に要素を追加し、結果を返すために使用されます。
  • append 関数を呼び出すときは、戻り値を受け取るために 元のスライス変数 を使用する必要があります。
  • append は要素を追加します。スライスにまだ の容量がある場合, it will be the new elements are located in the left space Behind the original slide. 基になる配列をアセンブルできない場合、Go はスライスを保存するために新しい基になる配列を作成し、それに応じてスライス アドレスも変更されます。
  • 新しいアドレスを割り当てた後、元のスライスの要素 を 1 つずつ新しいスライスにコピーして戻ります。

(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 括弧内のパラメータは 2 つだけです。 1 つのスライス、別のスライスが追加されます。

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 を使用してスライスを作成する場合、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))
	} 
}
ログイン後にコピー

出力結果 :

[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) append を使用して要素を削除する

Go には要素を特別に削除する機能はありませんが、スライス自体の特性を利用して要素を削除します。

つまり、削除された要素を分割点として、append を使用して前後 2 つの部分のメモリを再接続します。

:

スライス s 内の要素を削除する場合、削除された要素のインデックスはindex

であるため、削除処理は

s = append ( s[ :index ], s[ index+1: ] )
ログイン後にコピー

前後の 2 つの部分を再接続します。要するに、削除されたポイントの要素を前方に移動してメモリを再接続します。

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 で append を使用して要素を削除する原則は次のとおりです:

(絵はまったく見苦しくありません...)

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]
ログイン後にコピー

理解したら、次のプログラムの出力が何であるかを推測してみてください:

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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!