LoginSignup
2
0

More than 3 years have passed since last update.

今更ながらGo言語を触ってみた(GO 1.13.6)

Posted at

Go言語を触りたかったきっかけ

kubernetesを構築・活用しているうちにカスタマイズしてみたい衝動があり、
Go言語でのみカスタマイズが出来ることと
軽量のWebApiを構築することが多々あり普段はPythonで実装していたが、
この際なのでGo言語を触ってみることにしました。
と言っても実務があるので、学習期間は3日しかありませんでしたが・・・。

で、作ってみたもの

簡単にwebサーバーを立ち上げれるフレームワークを実装してみました。
内容的には下記のリンク先のREADMEにも記載していますが、
yamlファイルに諸々設定することでwebサーバーが起動します。
ビジネスロジックに集中出来るようにこのフレームワークを実装しています。

httprouter_wrapper

躓いた点

map[string]interface{}の仕組みがいまいちわかりづらかったです。
map[string]interface{}からvalueを取得する際に型が思っている型にならなかったりしていたので、
reflectモジュールを使用して型を確認したりして実装しました。

demo.go
// 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しなければなりませんでした。
この辺りがまだあやふやなので実務が落ち着いた時にでももう少し調査しようと思います。

test.yaml
test1:
  value1: value2

m変数にmap[string]interface{}が設定されているとして以下を実行すると

demo.go
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を取得することが出来ます。

sample.go
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でメソッドを記述したり、属性を与えることで
オブジェクト指向の様な記述をする必要があります。
パッケージ公開でも少し躓いてしまいましたのでまた手が空いたら記事にしようと思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0