コース目次 / 第0章
試食 — Goの口当たり
インストールなしで、ブラウザの中でGoを3つだけ触ってみます。
インストールは要りません。Goには公式のPlaygroundがあり、ブラウザだけでそのまま動きます。
用意するもの
ブラウザで Go Playground を開いてください。Goの公式サイトの中にある、そのまま実行できるページです。
すでにコードが入っています。Run ボタンを押してみてください。下に Hello, 世界 と出れば準備完了です。
ひと口め: 書き方の作法
エディタの中身を全部消して、これを貼ってください。
package main
import "fmt"
func main() {
for i := 1; i <= 3; i++ {
fmt.Println(i, "杯目")
}
}最初に気づくのは「決まり事が多い」ことだと思います。 package main で始まり、使うものを import し、func main() から動き出す。省略はできません。
これはGoの思想で、「書き方の自由度を下げて、読むときの負担を下げる」という設計です。ここが第一の分かれ目です。窮屈と感じるか、迷わなくて楽と感じるか。
もうひとつ試してください。Format ボタンを押します。字下げや空白が勝手に整います。
Goには「正しい見た目」が1つだけ決まっています。書き方でもめる余地がありません。
ふた口め: エラーは戻り値
package main
import (
"fmt"
"strconv"
)
func main() {
n, err := strconv.Atoi("123")
fmt.Println(n, err)
m, err := strconv.Atoi("abc")
fmt.Println(m, err)
}2行目の結果に注目してください。0 と、エラーの説明が出ます。
Goには例外(try/catch)がありません。失敗するかもしれない関数は、答えとエラーの2つを返します。呼ぶ側は毎回それを受け取ります。
このあと if err != nil という行を、うんざりするほど書くことになります。Goの挨拶みたいなものだと思ってください。冗長だという批判もあり、失敗を見落としにくいという評価もあります。ここが第二の分かれ目です。
み口め: 並行処理
Goの顔とも言える機能です。
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
start := time.Now()
for i := 1; i <= 3; i++ {
wg.Add(1)
go func() {
defer wg.Done()
time.Sleep(time.Second)
fmt.Println(i, "番、終わり")
}()
}
wg.Wait()
fmt.Println("かかった時間:", time.Since(start).Round(time.Millisecond))
}1秒かかる仕事を3つやったのに、合計は約1秒です。順番にやれば3秒かかるところを、同時に走らせています。
やったことは go と書いただけ。関数の前に go を付けると、それが同時に走ります。この手軽さがGoが選ばれる最大の理由です。
この言語の性格
| 感じたこと | Goの設計思想 |
|---|---|
| 決まり事が多い | 書き方を1つに絞って、読む負担とレビューの争いを減らす |
| エラーを毎回受け取る | 失敗を見落とさせない。隠れた例外の飛び方を無くす |
go だけで同時に走る |
並行処理を言語の中心に置いた、数少ない言語 |
ここまでで分かること
「合わないかも」と思ったなら、それも収穫です。15分で分かったなら上出来で、それがこの試食コーナーの目的です。別の言語を試すのも、まったく正しい進み方です。
「もう少し触ってみたい」と思ったなら、次の章で Go をあなたのパソコンに入れます。ここから先は手元に残る道具を作ります。
持ち帰りに進む前に
次の章で入れるものと、かかる時間の目安です。
| 内容 | |
|---|---|
| 入れるもの | Go本体(公式インストーラ) |
| ダウンロード | 約60MB |
| 時間の目安 | 20〜30分 |
| 環境構築の重さ | ★☆☆(コンパイル言語の中でいちばん軽い) |
こうなっていればOK
卒業まであと4章です。
この章はまだ完了していません。