えいやで会社をやめたらどうなるブログ

SwiftやGolangを中心に書いていくフリーランスエンジニアのブログ。

Golangで任意の型にあたるものはinterface{}

こんにちは。がわわです。

自分が詰まった部分は「Google App EngineのDatastoreで*Keyの配列をjsonで返す」というところでした。
以下は、ヘッダーに書かれたユーザーIDのtweet一覧をTweetというカインドから引っ張ってきて、keyとtweetjsonで返す関数を書こうと思ったダメな例です。

ダメな例

func GetTweets(w http.ResponseWriter, r *http.Request){
	c := appengine.NewContext(r)
	q := datastore.NewQuery("Tweet").
		Filter("UserId =", r.Header.Get("X-USERID"))
	var tweets []Tweet
	keys, err := q.GetAll(c, &tweets)
	if err != nil { panic(err) }
	
	//Keyが定義されていないからコンパイルエラー
	response := map[string][]*Key {
		"Keys": keys,
		"Tweets": tweets,
	}
	json, err := json.Marshal(response)
	if err != nil { panic(err) }
	w.Header().Set("Content-type", "application/json")
	w.Write(json)
}

正しい例

	//interface{}に任意の型を入れられる
	response := map[string]interface{}{
		"Keys": keys,
		"Tweets": tweets,
	}

interface{}とはメソッドが何もない空のインターフェースということですが、任意の型を入れられるものだということがわかりました。

参考サイト:
急いで学ぶGo lang#6 インターフェイス | Developers.IO