以前からGoに興味があったので勉強会に参加してきました。
私のGoレベルとしては、A Tour of Go を一通りやってみて、
簡単なツールを作ったことがある程度です。
非エンジニアの方もいたり、少人数で雰囲気もかたくなかったので質問もしやすかったです。
基礎的なことをじっくり学べる勉強会かと思います。
講義のスタイル
この勉強会は講義用の資料に沿って進めていて、
毎月1回の頻度で定期的に行われているそうです。
講義の最初に前回の復習を簡単にして、資料の続きをやっていきました。
講師の方が資料に沿って説明してくださり、
途中に課題があるのでそれを皆で解いて答え合わせをする、という流れです。
コードの実行は、ブラウザ上でGoを書いて実行できる
「Go Playground」を使って進めていくので、
Goの環境構築ができていなくても大丈夫でした。
講義内容
今回は主に「型」についての講義でした。
Go言語について
- 強い静的型付け言語
異なった型の演算をした場合はコンパイルエラーになります。
このため、バグを生みづらいといったメリットがあります。(Java、Scalaなど)
逆に動的型付け言語は、実行時にチェックするので、実行するまでエラーがわかりません。(Javascript、Python、phpなど)
- 型推論してくれる
型を定義していない変数に、int型とint型の演算結果を代入すると、結果の変数はint型だと認識してくれます。
- ユーザー定義型も使える
PersonやCarなども使うことができます。
- 組み込み型
元々使える型のことです。下記の型があります。
・bool -> 真偽値(デフォルトはfalse)
・string -> 文字列
・int uint -> 32または64ビット(実装に依存)
・int int8 int16 int32 int64 -> 符号あり整数
・uint8 uint16 uint32 uint64 -> 符号なし整数
・uintptr -> ポインタの値をそのまま格納するのに十分な大きさの符号なし整数
・byte -> uint8の別名
・rune -> int32の別名
・float32 float64 -> 浮動小数値(32/64ビット)
・complex64 -> float32の実数部と虚数部を持つ複素数
・complex128 -> float64の実数部と虚数部を持つ複素数
コンポジット型
複数の型があつまった型のことです。
��リストやスライス、Mapなど)
型リテラル
リテラル=識別子(名前)が付与されていない型のことです。
下記のようなもので、コンポジット型に使われます。
[]byte
map[string]int
構造体
型が異なるデータ型の変数を集めたデータ構造のことです。
フィールドの宣言と初期化を同時にする場合は、下記のようにします。
p := struct {
name string
age int
}{
name: "Gopher",
age: 10,
}
配列
ほとんどスライスを使うので、配列はあまり使わないそうです。
理由としては、要素数が違うと別の型になってしまうので融通が利きにくいからとのことです。
配列は下記のようにして初期化します。
ns := [...]int{10,20,30}
スライス
配列の一部を切り取ったものです。
a := [5]string{"dog", "cat", "rabbit", "hamster", "pig"}
b = ns[1:3]
fmt.Println(b) // [cat, rabbit]
配列[1]から始まって最初から3番目の値までなので、"cat"と"rabbit"が切り取られます。
左側が0始まりで右側が1始まりなので、
私としては少しわかりにくくてこの考え方は苦手です。
初期化は配列とは異なり、[]の中に何も書かない書き方をします。
ns := []int{10,20,30}
スライスは最初に宣言した長さのキャパシティこえるとコピーして作り直しますが、
パフォーマンスは悪くなるそうです。
このため、最初から最大の長さがわかっている場合は、その長さで宣言したほうがいいです。
Map
初期化は下記のようにします。
[]の中のキーは組み込み型だけ指定できます。
var m map[string]int
キーの存在確認をすることができます。
下記は変数okに値が存在していたら、printで出力します。
ちなみに、変数宣言と初期化を同時に行うとき:=
を使います。
if文では;
をつけることで、条件判定の前処理を行うことができます。
if n, ok := m["z"]; ok{
println(n)
}
講義を受けてみた感想
最近はGoを触っていなかったので、文法をかなり忘れていましたが、
進むスピードも速すぎず丁寧に教えてくださったので、非常に理解しやすかったです。
このような基礎的な講義を受けたのは久しぶりでしたが、
あまり理解できていない部分もあり、改めて基礎は大事だと実感しました。
課題のなかでエラーのプログラムを実行して、原因の箇所を修正する問題があり、
「エラーを正しく読むことが大事」という言葉が印象に残りました。
今回はやりませんでしたが、ポインタが1番よくわからないので、
またの機会にポインタについての講義を受けてみたいと思っています。
今後ももっとGoについて勉強して理解を深めていきたいです。
イベントを開催してくださった皆さま、ありがとうございました。