new takyam();

Qiitaぽい話はQiitaに書いていくことにする気がする http://qiita.com/takyam

#golang の revel でConfigをControllerで読もうとしてハマったはなし

Golangが熱いので最近触り始めました。
revel を使ってるんですが、とりあえずTwitterのOAuthサンプル 的なのをやってみようと思って、API-KEYとSecret-Keyを取得。
サンプルだとコントローラ内にベタ書きされてたけど流石にそれはいけてねぇよな、app.confとは別のconfにもたせよう、としたところで悲しいエラーが出て悲しい感じに悲しみました。

動くようになったコードが以下でし。

//抜粋
package controllers

import (
    "github.com/revel/revel"
    "fmt"
    "os"
)
var apiKey string = ""
var secretKey string = ""
func init (){
    revel.OnAppStart(func(){
        if twitterConf, err := revel.LoadConfig("twitter.conf"); err != nil {
            fmt.Printf("TwitterConf load failed. [%v]", err);
        }else {
            apiKey, _ = twitterConf.String("twitter.apikey")
            secretKey, _ = twitterConf.String("twitter.secretkey")
        }
        if apiKey == "" || secretKey == "" {
            fmt.Println("Twitter API|SECRET KEY must be set on twitter.conf .")
            os.Exit(1)
        }
    })
}
  • ハマったポイント
    • ifで初期化した変数がifのブロック内でしか有効じゃないぽい?
    • revel.OnAppStart 内でやらないとConfigのLoadで死ぬ
      • runtime error: invalid memory address or nil pointer dereference みたいなエラー出る

Goむずい。まだむずい。俺にとってむずい。がんばる。