新しいサイズは1.5倍なので、さらに拡大することができます。2度使っているその使い方に注目して下さい。2回めは追加する要素を古いデータのあとにコピーするために使っています。動作は前の例と同様です。設計する動機までたどり着きました。同じくらい効率的で、それでいてあらゆるスライス型で動作します。Goの弱点として、ジェネリクス型の操作はランタイムに行わなければいけないというものがあります。関数を提供しています。機能は先のintのスライスのバージョンと同じですが、あらゆるスライス型に対応している点が異なります。呼び出したあとは返されたスライスを保存しなければいけません。コンパイラがエラーを吐きます。使った言い回しをprint文とともに並べたものです。そのまま実行したり、編集したりしながら、機能を確認してみてください。2つのスライスを作成します。スライスにアイテムを追加します。スライスを他のスライスに追加します。(intの)スライスのコピーを作ります。スライスを自分自身の後ろにコピーします。77]スライスの設計によって簡潔な記述できちんと動作することを理解できるので、時間を取って最後の例の詳細な動作を考えてみましょう。スライスがどのように表現されるかわかります。nil,}あるいはsliceHeader{}と表現されます。スライスではありません。拡大して1つの要素も保持することさえできません。スライスは、たとえポインターが何も指していないとしても、機能的には長さ0のスライスと同値です。長さ0のスライスは、長さが0で確保することで要素を追加することが出来ます。スライスに追加しているものを確認して下さい。(string)この節では、スライスという観点から、Goにおける文字列の扱いについて簡単に説明します。文字列は、実際に非常に単純です。文字列は読み込み専用のバイトのスライスにいくつか言語からの構文サポートがついたものです。読み込み専用なので、(拡大させることができないことから)容量を考える必要がありません。単なる読み込み専用のバイトのスライスとして扱うことが出来ます。はじめに、個々のバイトにインデックスでアクセスすることが出来ます。部分文字列を取得するために文字列を切り取ることが出来ます。いう文字列を返します。文字列を切り取るときに、その裏で何が起きているかは明らかでしょう。単なるバイトのスライスから、単純にキャストすることで文字列を作ることも出来ます。string(slice)同様に逆も可能です。[]byte(usr)文字列の内部にある配列は見えないようになっていて、文字列(string)を通してしかその配列の中身にはアクセスできません。文字列とバイトスライスの間で変換を行うと、かならず配列のコピーが発生するということです。Goがコピー処理を行うので、自分で行う必要はありません。変換後のバイトスライス内の配列を操作しても、変換元の文字列には影響しません。文字列をスライスのような設計にしたことによる重要な帰結として、部分文字列を非常に効率よく精製できるようになったことがあります。部分文字列を作るときに必要なことは、2つのフィールドを持つ文字列のヘッダーを生成することです。文字列は読み取り専用なので、元の文字列とそこから得られた部分文字列は同じ配列を安全に共有できます。効率的な文字列操作のためのモデルが提供されました。結果としていくつかのベンチマークで大幅な高速化が確認されました。文字列に関してはもっと語ることがありますが、それは別のブログポストでより深く説明することにします。結論スライスがどのように動作するかを理解するために、スライスがどのように実装されているかを理解することがその助けになります。スライスヘッダーという小さなデータ構造がスライス変数と紐付いていて、そのヘッダーが確保された配列とは別にデータの区切りを示しています。スライスの値を渡すと、ヘッダーはコピーされますが、内部の配列へのポインターはつねに共有されます。強力で表現力の高いものとなります。関連記事Goのスライスに関する資料はたくさんあります。たくさんの例が載っています。メモリのレイアウトが、綺麗な図とともに説明されています。スライスが、Goの他の内部データ構造とともに議論されています。資料は他にもたくさんありますが、スライスを学ぶ最善の方法はそれを使うことです。(translation)。