Java
Go
golang
java8

Java 使いが Go言語を一日使って思ったこと

はじめに

タイトルに1日と書いていますが、はじめたのは一昨日くらいで、トータル8時間くらいはしたかな?と思ったので所感的なことをまとめます。

文字列の結合

よくループ中の文字列の結合に"+"は...的な記事を見かけますが、それではなく、文字列 + 数値の組み合わせのケースです。

Java だと

int bread = 13;
System.out.println("おまえは今まで食ったパンの枚数をおぼえているのか?");
System.out.println(bread + "枚 私は和食ですわ");

的な書き方をするけど。

Golang だと(すみません import とか省きます)

bread := 13
fmt.Println("おまえは今まで食ったパンの枚数をおぼえているのか?")
fmt.Printf("%d枚 私は和食ですわ\n", bread)

となる。

あとは型を変換したり。

bread := 13
breadStr := strconv.Itoa(bread)

三項演算子がない

ちゃちゃっと三項演算子で値返したいと思って書いたらシンタックスエラー。
ないのね...

Java だと

boolean isOk = true;
String text = isOk ? "OK" : "NG";

的なやつ。

Golang だと

isOk := true
text := "NG"
if isOk {
    text = "OK"
}

などなど。

ループ処理は for文のみ

Java8 とかだと StreamAPI とかでメソッドチェーン使ってどんどん書いていくけど、それができない。
拡張for文に近いソレがあるけど、少し注意が必要。

Java だと

String[] array = {"a", "b", "c"};

// StreamAPIとか
Arrays.stream(array).peek(System.out::println);

// 拡張for文とか
for (String text : array) {
    System.out.println(text);
}

的なやつ。

Golang だと

NG.go
array := []string{"a", "b", "c"}

for text := range array {
    fmt.Println(text)
}

だとダメで

OK.go
array := []string{"a", "b", "c"}

for _, text := range array {
    fmt.Println(text)
}

ですね。
for文で使える range は Multiple Return Values なので、1件目の戻り値はインデックス、2件目の戻り値が配列に格納されている値です。
2件目を省略してもエラーにならないので注意が必要です。

その他のこと

goroutine とか channel とかの非同期まわり、interface{} と型の関係とか、まだあまり触ってないので、もう少し触ってから書こうと思います。

おわりに

Go言語面白いです!
(と言うか、新しい言語の学習が楽しいのか)

色々と書く時に困ることもありますが、割ととっつきやすいなーと思いました。