はじめに
先日にアップしたはじめてのGo言語(3. 配列とスライス、マップ)に続いて、Go言語の基礎を学んだ記録を記事としてまとめてみました。
実行環境
WSL2(Ubuntu 22.04.3 LTS)
条件分岐
- 前回の配列/スライス/マップはやや癖がありましたが、条件分岐の書き方はかなり他の言語に近いと感じました。
-
else if
ではなく、Rubyのelsif
のように妙な書き方かと思ってドキドキしました💦
-
if.go
package main
import "fmt"
func main() {
var i int = 123
if i < 0 {
fmt.Printf("%dは負の数です。\n", i)
} else if i > 0 {
fmt.Printf("%dは正の数です。\n", i)
} else {
fmt.Printf("%dはゼロです。\n", i)
}
}
実行結果
# go run if.go
123は正の数です。
- 文字列の値の比較については、数値の比較と同様に「==」が使えます。
- Javaだと文字列の比較には「==」が使えず、
文字列.equals(比較対象の文字列)
などメソッドを使って比較するので、混同しないように注意が必要だと感じました。
- Javaだと文字列の比較には「==」が使えず、
if2.go
package main
import "fmt"
func main() {
var animal string = "cat"
if animal == "dog" {
fmt.Println("ワン")
} else if animal == "cat" {
fmt.Println("ニャー")
}
}
実行結果
# go run if2.go
ニャー
繰り返し
- if文と同様にfor文の構文も癖が感じられず、覚えやすいと感じました。
- ただし、カウンタ変数を
var i = 0;
やvar i int = 0
と書くと、syntax error: var declaration not allowed in for initializer
というエラーになってしまいます。- そのため、ここでは型推論を使って
i:=0
と書いています。
- そのため、ここでは型推論を使って
for.go
package main
import "fmt"
func main() {
var colors = [3] string {"Red", "Green", "Blue"}
for i:=0; i<len(colors); i++ {
fmt.Printf("%d番目の要素: %s\n", i, colors[i])
}
}
実行結果
# go run for.go
0番目の要素: Red
1番目の要素: Green
2番目の要素: Blue
- for文の条件を無くすと無限ループになります。
- ループを抜ける
break
、次のループへ進むcontinue
は他の言語と同じです。
- ループを抜ける
for2.go
package main
import "fmt"
func main() {
var i int = 0
for {
i++
if i%2 == 0 {
fmt.Printf("%dは偶数です\n", i)
} else {
fmt.Printf("%dは奇数です\n", i)
}
if i == 10 {
break
}
}
}
実行結果
# go run for2.go
1は奇数です
2は偶数です
3は奇数です
4は偶数です
5は奇数です
6は偶数です
7は奇数です
8は偶数です
9は奇数です
10は偶数です
- 配列やスライスなど反復可能なものについては、for文ではなく
range
を使ってループ処理を実現できます。 - この
range
を使った書き方がかなり独特で癖が強いので、個人的には他の言語のforeach
のようなシンプルかつfor文に近い構文の方が良かったですね...
for3.go
package main
import "fmt"
func main() {
var colors = [3] string {"Red", "Green", "Blue"}
for i, color := range colors {
fmt.Printf("%d番目の要素: %s\n", i, color)
}
}
実行結果
# go run for3.go
0番目の要素: Red
1番目の要素: Green
2番目の要素: Blue
まとめ
- if文とfor文は他の言語に近い構文で、Javaなどに慣れている人でも覚えやすいと感じました。
- 一方で
range
はかなり独特な構文なので、慣れるまではパッと書けない気がしました...