golang スライスの長さと容量はどれくらいですか

青灯夜游
リリース: 2023-01-14 10:44:37
オリジナル
2767 人が閲覧しました

golang では、スライス長はスライス内の要素の数です。スライス容量は、スライスが作成されたインデックスから始まる、つまり最初から数えた基になる配列内の要素の数です。スライスの要素を最下層に移動する 配列の末尾の要素の数。スライスの長さと容量を計算できます。組み込みメソッド len() で長さを取得でき、cap() で容量を取得できます。スライスを使用するプロセスで、append() を使用してスライスを作成する場合、スライスの長さがスライスの容量より大きい場合、スライスの容量は自動的に 2 倍に拡張されます。

golang スライスの長さと容量はどれくらいですか

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

Go 言語スライスには長さと容量があります。

  • スライスの長さはスライス内の要素の数です

  • スライスの容量は基礎となる配列内にありますスライスが作成されたインデックスから始まり、最初の要素から基礎となる配列要素の最後まで数えた要素の数。

スライスはインデックス付け可能であり、長さは len() メソッドで取得できます。スライスには、スライスがどのくらいの長さを維持できるかを測定できる、容量を計算するためのメソッド cap() が用意されています。 。スライスを使用する場合、append を使用してスライスの長さをスライスの容量より大きくすると、スライスの容量は自動的に 2 倍の形で拡張されます。

スライスは実際には配列の特定の部分を取得します。len スライス

cap() の結果によってスライス インターセプトの詳細が決まります

var sTest01 []int
func sliceTest01() {
	fmt.Printf("%T \n cap(sTest01) = %v \n", sTest01, cap(sTest01)) 
	sTest01 = append(sTest01, 1, 2, 3, 4, 5, 6)
	fmt.Printf("%T \n cap(sTest01) = %v \n", sTest01, cap(sTest01)) 
}
ログイン後にコピー

実行結果:

[]int 
 cap(sTest01) = 0 
[]int 
 cap(sTest01) = 6
ログイン後にコピー

最初はスライスの長さが 0 で、要素を追加した後の実際の長さは 6

#配列が値型でスライスが参照型であることを証明する例:

func sliceTest02() {
x := [...]int{1, 2, 3, 4, 5, 6}
y := []int{100, 200, 300, 400}
w := x
z := y
w[0] = 777
z[0] = 999
fmt.Println("x = ", x, "\nw = ", w)
fmt.Println("y = ", y, "\nz = ", z)
}
ログイン後にコピー

実行結果:

x =  [1 2 3 4 5 6]
w =  [777 2 3 4 5 6]
y =  [999 200 300 400]
z =  [999 200 300 400]
ログイン後にコピー

実行結果からわかるように、z の変更は、 y の値。スライスが参照型であることを示します。

スライスには独自のデータはありません。基になる配列への参照にすぎません。スライスに加えられた変更は、基になる配列に反映されます。配列は値型であるのに対し、スライスは参照型です

func sliceCap() {
arr := [...]string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"}
fmt.Println("cap(arr) = ", cap(arr), arr)

//截取数组,形成切片
s1 := arr[2:8]
fmt.Printf("%T \n", s1) 
fmt.Println("cap(s1) = ", cap(s1), s1)

//截取数组,形成切片
s2 := arr[4:7]
fmt.Printf("%T \n", s2)
fmt.Println("cap(s2) = ", cap(s2), s2) 

//截取数组,形成切片
s3 := s1[3:9]
fmt.Printf("%T \n", s3)
fmt.Println("cap(s3) = ", cap(s3), s3) 

//截取数组,形成切片
s4 := s2[4:7]
fmt.Printf("%T \n", s4)
fmt.Println("cap(s4) = ", cap(s4), s4) 

//证明切片是引用类型
s4[0] = "x"
fmt.Println(arr, s1, s2, s3, s4)
}
ログイン後にコピー

実行結果:

cap(arr) =  11 [a b c d e f g h i j k]
[]string 
cap(s1) =  9 [c d e f g h]
[]string 
cap(s2) =  7 [e f g]
[]string 
cap(s3) =  6 [f g h i j k]
[]string 
cap(s4) =  3 [i j k]
[a b c d e f g h x j k] [c d e f g h] [e f g] [f g h x j k] [x j k]
ログイン後にコピー
結果から、スライスのインターセプトではスライスしか生成できないことがわかります。コンテンツが十分にインターセプトされていない場合、後続の値は基になるものから与えられます配列。長さが不十分な場合は、エラーが報告されます。

スライスが空かどうかを判断するために、nil を直接使用するのは不正確です。

Golang では、len が 0 であるが cap が 0 ではない、または両方が 0 であるスライスを許可するため、一般にスライスの長さは直接ではなく、len を通じて取得され、空のスライスであるかどうかが判断されます。スライスと nil を合計すると、直接比較が行われます。

【関連する推奨事項:

Go ビデオ チュートリアル プログラミング教育

以上がgolang スライスの長さと容量はどれくらいですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート