複数のプログラミング言語で配列の宣言、初期化をやってみた（Go言語、TypeScript、PHP、Rust）

# はじめに
あじ太郎は複数のプログラミング言語を使っています。
そうすると、それぞれ配列の宣言や初期化の書き方が少しづつ異なっていてまぎらわしくて、頭がこんがらがるときがあります。
そこで、それぞれの書き方をサンプルコードとしてまとめてみようと思いました。
対象は、Go言語、TypeScript、PHP、Rust です。

# サンプルコード
以下にアップしてあります。
https://github.com/aji-taro/declaring_arrays
サンプルコードとそれを試すための Docker のファイルを含めてあります。
README.md にサンプルコードの実行方法を記載しました。

# Go言語
最初は、Go言語の配列の宣言。
```main.go
// 基本
array01 := [3]int{1, 2, 3}
```
:= で変数宣言になったり、通常の配列で [] ではなく {} を使うのは他ではあまりない気がする。

... を指定すると要素数を自動でカウントして設定してくれる。
... は、pack 演算や unpack 演算の意味もあるけど、一つのキーワードでいろいろできて、種類をあまり増やさない感じ、こういうところはGo言語ぽさかな。
```main.go
// ... を指定すると要素数を自動で設定してくれる
array02 := [...]int{10, 20, 30, 40}
```
要素数を指定しないとスライスになる。
配列と異なり、スライスは可変長。
```main.go
// 要素数を省略するとスライスになる
array03 := []int{100, 200, 300, 400, 500}
```
make でスライスを作る例。
```main.go
// make でスライスを作成
array04 := make([]int, 6)
```
二次元配列は、そんなに変わったことはないかな。
```main.go
// 二次元配列 (2行 * 3列の配列の例)
array05 := [2][3]int{
    {1, 2, 3},
    {10, 20, 30},
}
```
Go言語の場合、要素の追加は append 関数。
```main.go
// 要素の追加
a := []int{11, 22, 32}
array06 := append(a, 44, 55)
```
Goの連想配列といえば、map 型。
```main.go
// 連想配列 (map)
array07 := map[string]int{
    "goals":   3,
    "assists": 5,
    "duels":   7,
}
```

# TypeScript
今回、複数の言語を一つのコンテナで使いたいと思って、Docker のセオリーに反してサンプルの実行環境 (Ubuntu) ひとつにすべてインストールしてみたんだけど、npm のインストールで時間がかかる。。
やはり、汎用的なイメージではなく最初から TypeScript が使えるイメージを利用した方がよさそうだし、となると Docker は機能ごとにコンテナを分けた方がよいということを期せずして検証してしまった。

TypeScript も配列の基本から。
```main.ts
// 基本
const array01 = [1, 2, 3];
```

二次元配列でも特にかわったことはないかな。
```main.ts
// 二次元配列
let array02: number[][] = [[10, 20, 30], [100, 200, 300]];
```

TypeScript では配列に要素を追加するには push メソッド。
（先頭に追加する場合は unshift メソッド）
```main.ts
// 要素の追加
let array03 = [11, 22, 33];
array03.push(44, 55);
```

TypeScript の連想配列の書き方は、そこはかとなくごつく感じる。
これは配列というよりオブジェクトかな。
```main.ts
// 連想配列 その 1
const array04: { [key: string]: number } = {
    goals: 3,
    assists: 5,
    duels: 7,
  };
```

TypeScript の type と組み合わせて連想配列を定義してみる。
```main.ts
// 連想配列 その 2 (type を組み合わせてみる)
type ArrayType = { [key: string]: string|number };
const array05: ArrayType = {
    id: 123,
    name: 'taro',
    age: 200,
    location: 'umi',
};
```

今回、調べていたら Map オプジェクトというのもあることを知る。

# PHP
PHPの印象は、バージョン 6 がスキップになったり
一時期停滞ぎみだったけど
バージョン 7 リリースあたりから一気に進化した感じ。

PHP の配列。
最初は \\$ マークをつけることに違和感があったけど慣れると \\$ マークがないと変に感じてくるから不思議。
```main.php
// 基本
$array01 = [1, 2, 3, 4];
```

二次元配列の書き方も変わったことはないかな。
```main.php
// 二次元配列
$array02 = [[10, 20, 30], [100, 200, 300],];
```
PHP で配列に要素を追加するのは array_push 関数。
```main.php
// 要素の追加
$array03 = [11, 22, 33];
array_push($array03, 44, 55);
```

=> を使うのが個性的。
```main.php
// 連想配列
$array04 = [
    "goals" => 3,
    "assists" => 5,
    "duels" => 7,
    ];
```

# Rust
実は今までに使ったことはないけど興味があったので、この機会に少し触ってみました。

Rust も基本の書き方から。
```main.rs
	// 基本
    let array01 = [1, 2, 3];
```

Rust の二次元配列は個性的。
配列を定義する際、変数名[型;要素数] みたいに書くので、型のところに [型;要素数] を入れるとこうなるのね。
一貫した記述方法とはいえネストして書くのは、他では見たことないかな。
```main.rs
	// 二次元配列
    let array02: [[i32; 3]; 2] = [[10, 20, 30], [100, 200, 300]];
```

Rust の push メソッド。
```main.rs
	// 要素の追加 ※vec
    let mut vector01 = vec![11, 22, 33];
    vector01.push(44);
```

Rust の連想配列。
to_ownedというメソッド名、独特な感じ。
```main.rs
    // 連想配列 ※vec
    let vector02 = vec![
        ("goals".to_owned(), 3),
        ("assists".to_owned(), 5),
        ("duels".to_owned(), 7),
    ];
```

# 取り組んでみて
プログラミング言語それぞれの書き方をアウトプットして、少し頭の中が整理できたあじ太郎なのでした。