Golangで任意の型にあたるものはinterface{}
こんにちは。がわわです。
自分が詰まった部分は「Google App EngineのDatastoreで*Keyの配列をjsonで返す」というところでした。
以下は、ヘッダーに書かれたユーザーIDのtweet一覧をTweetというカインドから引っ張ってきて、keyとtweetをjsonで返す関数を書こうと思ったダメな例です。
ダメな例
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{}とはメソッドが何もない空のインターフェースということですが、任意の型を入れられるものだということがわかりました。