ここからはGo言語のデータ構造について扱っていきましょう。
まず、ここでは配列(Array)について見ていきます。
ただ、Go言語では配列よりも別で扱うスライスを利用することの方が多いようです。
配列の宣言
どのプログラミング言語でも配列はありますから、どんなものかはわかりやすいと思います。
Goの配列は、決まった長さを持ち、順序のある要素のコレクションです。
配列の宣言は次のような形になります。
var 配列名 [要素数]型名
変数を宣言して、角括弧[]の中に格納するデータの数を記入し、データの型名を続けて記述します。
要素の値を代入して宣言する場合は次の形で行います。
var 配列名 [要素数]型名 = [要素数]型名{要素a, 要素b,...}
配列の変数宣言にイコールを続けて、要素数と型名の後に波括弧{}で要素の値を格納します。
具体的なコードで見て行きましょう。
package main
import "fmt"
func main() {
var a [3]int
a[0] = 100
a[1] = 200
a[2] = 300
fmt.Println(a)
var b [3]string = [3]string{"Go", "Python", "JavaScript"}
fmt.Println(b)
}
配列の変数を宣言して、値を格納するには、変数に続けて角括弧[]の中にインデックスを指定し、イコールで値を代入します。
配列の変数を宣言すると同時に値を格納する場合は、2つ目の例のようにイコールに続けて要素数を角括弧に記述し、波括弧{}を続けてその中にデータを格納しているのがわかります。
実行結果は次のようになります。
[100 200 300]
[Go Python JavaScript]
配列の範囲外の扱い
配列は要素数を宣言していますが、その要素数を超えてデータを格納することはできるのか?
コードで確認してみましょう。
package main
import "fmt"
func main() {
var a [3]int
a[0] = 100
a[1] = 200
a[2] = 300
a[3] = 400
fmt.Println(a)
}
先ほどのコードを使って、要素を一つ増やしています。
結論としては、これはエラーになります。
invalid array index 3 (out of bounds for 3-element array)
配列の宣言で指定した要素数を超えてのデータは格納することができません。これが配列の特徴です。(別で触れるスライスではこれが可能になります)
逆に宣言した要素数より少ないデータを格納することはできます。ただし、格納していない部分には空のデータが入っている形で、格納しているデータの数は宣言していた通りのものになります。
package main
import "fmt"
func main() {
var c [4]string = [4]string{"Go", "Python", "JavaScript"}
fmt.Println(c)
fmt.Println(len(c))
}
4つ要素を持つ配列宣言ですが、3つしか値を格納していません。
実行結果は以下のようになります。
[Go Python JavaScript ]
4
配列の最後に空白があり、データの長さも3ではなく4になっているのがわかります。
配列の要素へのアクセス
宣言した配列の各要素にアクセスするには、インデックスを指定して要素を取り出すことができます。
コードで見て行きましょう。
package main
import "fmt"
func main() {
var c [4]string = [4]string{"Go", "Python", "JavaScript"}
c[3] = "Swift"
fmt.Println(c)
c0 := c[0]
c1 := c[1]
c2 := c[2]
c3 := c[3]
fmt.Println(c0)
fmt.Println(c1)
fmt.Println(c2)
fmt.Println(c3)
}
先ほどのコードを利用して、インデックスでアクセスしているのがわかります。
まず、値の入っていなかった場所にインデックスを指定して値を格納し、そのあとでそれぞれのインデックスを指定して値を取り出して出力する処理になっています。
結果は以下の通り。
[Go Python JavaScript Swift]
Go
Python
JavaScript
Swift
指定の位置にSwiftと格納して、それぞれの要素を取り出しているのがわかります。
Pythonコードで書くと…
Pythonには配列ではなく、似たような形ではリストというデータ構造になります。
ただ、Goのこの配列のように要素数を指定して宣言するようなものでは無いので、少し性質が異なります。
def main():
lang = ["Go", "Python", "JavaScript"]
lang.append("Swift")
print(lang)
lang0 = lang[0]
lang1 = lang[1]
lang2 = lang[2]
lang3 = lang[3]
print(lang0, lang1, lang2, lang3)
if __name__ == "__main__":
main()
ここではappend()を使ってリストにデータを追加してみました。
それぞれインデックスを指定して要素を取り出しています。
結果は次のようになります。
['Go', 'Python', 'JavaScript', 'Swift']
Go Python JavaScript Swift
最後に
Goの配列(Array)について見てきました。
配列の宣言は、var 配列名[要素数]型名 の形で宣言します。値を格納して宣言する場合は、波括弧で要素を格納して行きます。
Goの配列は、宣言した要素数を超えてデータを格納することはできません。
要素にアクセスするには、配列のインデックスを指定して値を取り出します。
Goでは配列よりもスライスを利用することの方が多いようです。次からスライスを扱います。