はじめに
先日にアップしたはじめてのGo言語(2. 変数と定数、データ型)に続いて、Go言語の基礎を学んだ記録を記事としてまとめてみました。
実行環境
WSL2(Ubuntu 22.04.3 LTS)
配列
- 配列の宣言は
配列名 [配列の長さ] データ型
という書き方ですが、様々なサイトを見ても「間に半角スペースを挟まない配列名[配列の長さ]データ型
」という書き方が主流になっているようです。- 実際にはどちらの書き方でも動くのですが、他の言語から見ると「半角スペースがあっても無くても正常に動く」というのは少々気持ちが悪いですね...
array.go
package main
import "fmt"
func main() {
var colors [3] string
colors[0] = "Red"
colors[1] = "Green"
colors[2] = "Blue"
fmt.Println(colors[0], colors[1], colors[2])
}
実行結果
# go run array.go
Red Green Blue
- 配列の宣言と同時に初期化する場合は、以下のように記述します。
array2.go
package main
import "fmt"
func main() {
var colors = [3] string {"Red", "Green", "Blue"}
fmt.Println(colors[0], colors[1], colors[2])
}
スライス
- Go言語では、可変長の配列を「スライス」と呼ぶそうです。
- JavaだとArrayListに相当するオブジェクトだと思われます。
- スライスの宣言は配列の宣言と似ていますが、「配列の長さ」を指定しない点が異なっています。
- 要素の追加には
append
メソッドを使いますが、要素追加後のスライス = append(要素を追加するスライス, 追加する要素)
という書き方なので要注意です。- 他の言語だと
要素を追加するオブジェクト.append(追加する要素)
という書き方になることが多いので、スライスの操作は間違えやすそうだと感じました。
- 他の言語だと
slice.go
package main
import "fmt"
func main() {
var colors [] string
colors = append(colors, "Red")
colors = append(colors, "Green")
colors = append(colors, "Blue")
fmt.Println(colors[0], colors[1], colors[2])
}
実行結果
# go run slice.go
Red Green Blue
マップ
- Go言語では連想配列をマップ(map)と呼ぶそうです。
- 他の言語だと
HashTable
やDictionary
などと呼ばれることもありますが、この辺り。
- 他の言語だと
- マップの宣言は
マップ名 map [キーのデータ型] 値のデータ型
という形で、ここまでは腑に落ちるのですが、これだけだとマップのオブジェクトがnilのままとなるため、書き込みをしようとするとランタイムパニックを起こします。- 書き込み時にランタイムパニックを起こすと、
panic: assignment to entry in nil map
というエラーが表示されます。 - 参考URL:Go言語におけるマップの使い方
- 書き込み時にランタイムパニックを起こすと、
- そのため、マップは
マップ名 = make(map [キーのデータ型] 値のデータ型)
という構文で初期化する必要があります。
map.go
package main
import "fmt"
func main() {
var members map [string] int
members = make(map [string] int)
members["Miura"] = 18
members["Azuma"] = 11
members["Kuwahara"] = 1
members["Sano"] = 7
members["Maki"] = 2
fmt.Println(members["Sano"])
}
実行結果
# go run map.go
7
- マップの宣言と同時に初期化を行う場合、以下のように書きますが...
- 最後の要素(ここでは"Maki")の後ろに
,
を入れないと構文エラーになってしまうので注意が必要です。- 最後のカンマが不足していると、
syntax error: unexpected newline, expecting comma or }
というエラーが表示されますが、最初は何がエラーなのか全く分からずに右往左往しました💦
- 最後のカンマが不足していると、
map2.go
package main
import "fmt"
func main() {
var members = map [string] int {
"Miura": 18,
"Azuma": 11,
"Kuwahara": 1,
"Sano": 7,
"Maki": 2,
}
fmt.Println(members["Sano"])
}
まとめ
- 配列、スライス、マップのいずれも、私が使ってきたJavaやC#などの言語と比べると癖があると感じました。
- 特にマップは
map new()
のような形ではなく、make(map [キーのデータ型] 値のデータ型)
という見たことの無い構文で初期化するので、覚えづらいと感じました。 - また、マップの宣言と初期化を同時に行う際に、最後の要素の後ろに
,
を入れないといけないという点も、他の言語とは異なるGo言語の特徴だと感じました。