Go言語を触りたかったきっかけ
kubernetesを構築・活用しているうちにカスタマイズしてみたい衝動があり、
Go言語でのみカスタマイズが出来ることと
軽量のWebApiを構築することが多々あり普段はPythonで実装していたが、
この際なのでGo言語を触ってみることにしました。
と言っても実務があるので、学習期間は3日しかありませんでしたが・・・。
で、作ってみたもの
簡単にwebサーバーを立ち上げれるフレームワークを実装してみました。
内容的には下記のリンク先のREADMEにも記載していますが、
yamlファイルに諸々設定することでwebサーバーが起動します。
ビジネスロジックに集中出来るようにこのフレームワークを実装しています。
躓いた点
map[string]interface{}
の仕組みがいまいちわかりづらかったです。
map[string]interface{}
からvalueを取得する際に型が思っている型にならなかったりしていたので、
reflect
モジュールを使用して型を確認したりして実装しました。
// yamlファイルから読み込んでますがエラー処理は省いています。
var m map[string]interface{}
buf , err := ioutil.ReadFile("filename.yaml")
yaml.Unmarshal(buf, &m)
// valueの内容を取得したい為にValueOfで取得する。
v := reflect.ValueOf(m)
// 型の種類をKindメソッドで取得する。
k := v.Kind()
fmt.Print(k)
また、interface{}型については全ての型を受け入れれるのですが、
map[string]interface{}
の値がstring
の時でも
cast時にmap[string]interface{}
でcast出来ず、map[interface{}]interface{}
でcastしなければなりませんでした。
この辺りがまだあやふやなので実務が落ち着いた時にでももう少し調査しようと思います。
test1:
value1: value2
m変数にmap[string]interface{}が設定されているとして以下を実行すると
log.Print(m["test1"].(map[string]interface{}))
panic: interface conversion: interface {} is map[interface {}]interface {}, not map[string]interface {}
というエラーが発生し、エラーの内容の通り
map[string]interface{}
をmap[interface{}]interface{}
に変換出来ないというエラーが出力されました。
エラーの通りにmap[interface{}]interface{}
でcastを行い、
keyを文字列で指定するとvalueを取得することが出来ます。
buf, _ := ioutil.ReadFile("test.yml")
var m map[string]interface{}
yaml.Unmarshal(buf, &m)
m1 := m["test1"].(map[interface{}]interface{})
// 念の為stringへcast
log.Print(m1["value1"].(string))
あとは、型アサーションぐらいですかね。
上記でも記載していますが、
interface{}
型から別の型へcast(代入)する際の記述方法が
.(T)
の記載方法で型変換(代入)が可能になります。
まとめ
オブジェクト指向言語を扱うことが多いので、Classが存在せず、
struct
interface
でメソッドを記述したり、属性を与えることで
オブジェクト指向の様な記述をする必要があります。
パッケージ公開でも少し躓いてしまいましたのでまた手が空いたら記事にしようと思います。