Go言語の配列:[...]
の魅力を知ろう!
Go言語では、配列のサイズを簡単に指定できる [...]
という記法が用意されています。この記事では、[...]
を使った配列の宣言方法や、C言語との比較を通じてその特徴を解説します。
[...]
の特徴
Go言語の [...]
を使うと、配列のサイズをリテラルに基づいてコンパイラが自動で決定します。具体例を見てみましょう。
使用例
package main
import "fmt"
func main() {
var arr1 = [...]int{1, 2, 3, 4} // 配列のサイズを自動決定
fmt.Println(arr1) // 出力: [1 2 3 4]
fmt.Println(len(arr1)) // 出力: 4
}
動作内容
[...]
を使うことで、配列のサイズを明示的に書く必要がありません。- 初期化リスト
{1, 2, 3, 4}
の要素数をもとに、自動的に配列のサイズ(ここでは4)が決まります。 - 配列は
[4]int
のように固定長となります。
配列とスライスの違い
Go言語には配列とスライスの2種類があります。それぞれの特徴を理解しておきましょう。
- 配列:固定長でサイズは変更できません。
- スライス:サイズ変更が可能で、柔軟に要素を追加したり削除したりできます。
スライスの例
slice := []int{1, 2, 3, 4} // スライスの宣言
slice = append(slice, 5) // 要素を追加
fmt.Println(slice) // 出力: [1 2 3 4 5]
Go言語スライスとPythonリストの類似点
Go言語のスライスは、Pythonのリストに似た動作をします。以下の点で共通点があります。
- 可変長:要素を自由に追加・削除できます。
- 範囲指定(スライシング):部分的な要素の取得が可能です。
- 初期化が簡単:リテラルを使用して簡潔に初期化できます。
Goスライスのスライシング例
slice := []int{1, 2, 3, 4, 5}
subSlice := slice[1:4] // インデックス1から3までの部分取得
fmt.Println(subSlice) // 出力: [2 3 4]
Pythonリストのスライシング例
lst = [1, 2, 3, 4, 5]
sub_lst = lst[1:4] # インデックス1から3までの部分取得
print(sub_lst) # 出力: [2, 3, 4]
Go言語スライスとPythonリスト違い
- Goスライスは型の一致が必要ですが、Pythonリストは異なる型の要素を混在させることができます。
- Goスライスはベース配列の参照として動作しますが、Pythonリストは独立したコピーを作成します(明示的にスライスを操作しない限り)。
C言語での配列の固定長指定
一方、C言語でも配列のサイズを固定する仕組みがあります。ただし、Go言語ほど簡潔ではありません。
配列のサイズ推測
C言語では、初期化リストを使うことで配列のサイズを自動的に推測できます。
使用例
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3, 4}; // サイズを明示せず初期化
printf("サイズ: %lu\n", sizeof(arr) / sizeof(arr[0])); // 配列サイズを計算
return 0;
}
動作内容
int arr[]
と記述することで、初期化リスト{1, 2, 3, 4}
の要素数をもとに配列のサイズ(ここでは4)が自動的に決まります。- 配列のサイズは固定され、変更はできません。
Go言語とC言語の比較
特徴 | C言語 | Go言語 |
---|---|---|
配列のサイズ推測 | 初期化リストから推測 | [...] を使用 |
配列の性質 | 固定長 | 固定長 |
スライス(動的サイズ) | 明示的にポインタとメモリ操作で実現 | スライス型([]T )を標準でサポート |
結論 配列の扱いやすさで選ぶなら?
Go言語では、[...]
を使うことで配列のサイズを簡潔に指定できます。特に初期化リストを使用する際、この記法は非常に便利です。
また、Go言語のスライスはPythonのリストに似た柔軟な操作性を持ち、スライシングや動的なサイズ変更を簡単に行えます。一方で、C言語では配列のサイズを自動推測できますが、可変長の配列を扱うには追加の工夫が必要です。
どちらの言語でも配列は固定長ですが、動的なサイズ変更が必要な場合には、Go言語のスライスが特に優れた選択肢となるでしょう。用途に応じて使い分けましょう!
コメントを残す