この記事は、go 言語 チュートリアル コラムから、go で Slice を使用する際の注意事項を共有するために提供されたものです。
この記事では、Go でのスライスの使用について説明します。次のプログラムを見てみましょう。
package mainimport (
"fmt"
)func main() {
var array [10]int
var slice = array[5:6]
fmt.Println("lenth of slice: ", len(slice))
fmt.Println("capacity of slice: ", cap(slice))
fmt.Println(&slice[0] == &array[5])}
ログイン後にコピー
- このプログラムについて言いたいことは、 main 関数で定義されているということです。長さ 10 の整数配列を作成し、スライスを定義し、配列の 6 番目の要素を切り取り、最後にスライスの長さと容量を出力して、スライスの最初の要素のアドレスとスライスの 6 番目の要素のアドレスが一致するかどうかを判断します。配列は等しいです。
- スライスの最初の要素が配列の 6 番目の要素と等しいかどうかを誰もが考えます。おそらく、このプログラムを実行してそれを証明し、以下の結果を見てください。わかりました、私はそうではありません上記のプログラム データ配列 array でスライスを作成し、配列と記憶領域を共有します スライスの開始位置は array[5]、長さは 1、容量は 5 です。 0] と array[5] は同じです。
次に、このプログラムを見て、自分で実行してみましょう。実践こそが最良の教師です。
package mainimport (
"fmt")func AddElement(slice []int, e int) []int {
return append(slice, e)
}func main() {
var slice []int
slice = append(slice, 1, 2, 3)
newSlice := AddElement(slice, 4)
fmt.Println(&slice[0] == &newSlice[0])}
ログイン後にコピー
- 私がこのプログラムで表現したいこと上の段落は次のとおりです。関数 AddElement() はスライスと要素を受け取り、要素をスライスに追加して、スライスを返します。 main() 関数でスライスを定義し、スライスに 3 つの要素を追加します。次に、AddElement() を呼び出してスライスに 4 番目の要素を追加し、新しいスライス newSlice を定義します。最後に、新しいスライス newSlice と古いスライスがストレージ領域を共有しているかどうかが判断されます。
- このプログラムでは、多くの友人が追加によって古いスライスの拡張がトリガーされる可能性があると考えていると考えていますが、それについては確信がありません。 「可能」が「確実」になりました:
1. append 関数が実行されると、スライス容量が新しい要素を格納できるかどうかが判断され、そうでない場合は、ストレージ スペースが再申請されます。そして、新しい記憶領域は元のサイズの 2 倍になります。または 1.25 倍 (元の拡張された領域のサイズによって異なります)。この例では、実際には 2 つの追加操作が実行されます。最初の領域は 4 に増加するため、2 番目の追加は再び拡張することはないため、古いスライスと新しいスライスはストレージ領域の一部を共有します。プログラムは「true」を出力します。
次に、このプログラムがどのように出力されるかを確認し続けます。それについて考えることも、プログラムを実行することもできます:
package mainimport (
"fmt")func main() {
orderLen := 5
order := make([]uint16, 2 * orderLen)
pollorder := order[:orderLen:orderLen]
lockorder := order[orderLen:][:orderLen:orderLen]
fmt.Println("len(pollorder) = ", len(pollorder))
fmt.Println("cap(pollorder) = ", cap(pollorder))
fmt.Println("len(lockorder) = ", len(lockorder))
fmt.Println("cap(lockorder) = ", cap(lockorder))}
ログイン後にコピー
上記のプログラムを実行した後、疑問が生じ、読み続けてください。プログラムは、長さ 10 のスライス順序、pollorder、lockorder をそれぞれ定義します。 order 順序スライス [start ,stop,max] 操作によってスライスが生成され、最後にプログラムは、polorder と lockorder の容量と長さをそれぞれ出力します。
order[start,stop,max] は注文をスライスすることを意味し、新しいスライス範囲は [start, stop)、新しいスライス容量は max です。注文の長さは orderLen の 2 倍で、polorder スライスは注文の前半を指し、lockorder は注文の後半を指します。つまり、元の注文が 2 つのセグメントに分割されます。したがって、polorder とlockerorder の長さと容量は両方とも orderLen、つまり 5 になります。 -
- この記事では、Slice の使用方法について説明します。困っているパートナーのお役に立てれば幸いです。Slice の使用方法の詳細については、ディスカッションするメッセージを残してください。
以上がGo で Slice を使用する際のメモを共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。