私は普段PythonとTypeScriptばかり書いています。
GWで時間があったのでかねてからやってみたいと思っていたGo言語を触ってみたので
詰まったところをまとめておきます。
PythonとGoだと一番大きな違いは型付けだと思いますが、
普段からPythonでも型定義をしながら書いているのでそこは問題に感じませんでした。
私が理解に時間がかかったのは以下の項目です。
- Json
- インターフェース
- パッケージの扱い
パッケージの扱い
Goのパッケージはファイル単位ではありません。
package パッケージ名
のようにファイルの先頭で指定したパッケージ名ごとに分かれます。
同じパッケージ内であれば特に明示しなくてもファイル間で参照し合えます。
また、ファイルの外部から参照する際には全ての命名を大文字で始めなければなりません。
構造体のプロパティも例外ではないので全て大文字で始まります。
type SomeStruct struct {
propertyName string // <-こうじゃなくて
PropertyName string // <-こう
}
Json
構造体をJsonに変換するときに、タグを付けなければならないという所でも若干詰まりました。
type SomeStruct struct {
PropertyName string `json:"propertyName` <-最後のこれ
}
こうするとJson化するときにキー名を小文字で始めることができます。
上の構造体のプロパティ名が大文字で始まってしまう仕様と関係していそうです。
また、このタグはJson以外のパースにも使われますし、
バリデーションを行うためにRequiredのフラグを立てたり、最大、最小値を指定することにも使われます。
インターフェース
Go言語のインターフェースは他言語のインターフェースと使い方が異なります。
JavaやTypeScriptであればクラスを定義する際にimplement句などで
インターフェースを実装している事を明示しますが、
Go言語のインターフェースは使い方が異なります。
インターフェースで定義されているメソッドを持つ型であれば、
特に明示しなくてもそのインターフェースを実装していることになります。
type Reader interface {
Read() string
}
type Human struct {}
// ここでHumanにEaterを実装していることになる。
func (h Human*) Read() {
return "..."
}
ではどういう時に便利なのかというと、構造体を初期化する関数の返り値をその構造体自身ではなく
インターフェースを指定することでより高度にカプセル化できます。
また、テスト用にモックを作る時にも役立ちます。
Goのインターフェースの使い方は特殊な感じがしますが、
下記のエムスリーさんのテックブログが大変分かりやすかったので参考にさせていただきました。
https://www.m3tech.blog/entry/go
未解決問題
なんでEnum型ないんだろう。。。
最後に
Goを勉強する上で、実際に手を動かす前には
クラスの継承がなかったり型を常に定義したりといった所に目がいっていました。
しかし、実際にコードを書いてみるとそれらはそこまで大したハードルにはならず、
意外なところにつまづきポイントがありました。
新しい言語を学習するとプログラミングに関する理解も深まって良いですね。