初投稿です。
GAE/Goでgo1.11対応をしたときに、タイトルのエラーでだいぶハマってしまいました。
経緯
従来は、セッションのicza/sessionを使用していたのですが、build appengineタグが廃止されたとのことで現在正しく動かなくなっています。そのため、gorilla/sessionsを使ってセッションまわりのコードを書き直していたら...という感じで、セッションまわりの対応で下記のエラーと戦うことになりました。
ERROR: %!(EXTRA securecookie.MultiError=securecookie: error - caused by: securecookie: error - caused by: gob: name not registered for interface: "hoge"
やったこと
デバッグ用のページを作り、そこでエラーの原因を調べます。
色々と調べてみて、とりあえずセッション名を変更して、新しいセッションを生成。
session.go
const (
// ここを変更
sessionName = "session"
)
func newSession(c echo.Context) (*sessions.Session, error) {
store := sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))
session, err := store.Get(c.Request(), sessionName)
return session, err
}
func SaveSession (c echo.Context) {
sess, err := newSession(c)
// セッションを保存する処理
}
次に、newSessionが呼ばれるたびに、新しいクッキーストアが生成されるのが影響しているのかと考え、sessions.NewCookieStoreを関数の外に出してみました。
session.go
const (
sessionName = "session"
)
var store = sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))
func newSession(c echo.Context) (*sessions.Session, error) {
session, err := store.Get(c.Request(), sessionName)
return session, err
}
func SaveSession (c echo.Context) {
sess, err := newSession(c)
// セッションを保存する処理
}
これで、デバッグ用のページではエラーが出なくなったのですが、セッションを使用したいページで同じことをしてもエラーは変わりません。
そこから色々と考えられる限りのことを試していき、
app.go
func main() {
//構造体を使う場合、セッションの保存などの処理が行われる前にRegisterをしておかないとエラーになる
gob.Register(Hoge{})
// 以下ルーティング等
}
セッションの処理を呼び出している全ての処理の前で、gob.Registerで型の登録をすることで解決しました。
(これまでは、様々なところでセッションの処理を呼び出している内の、一ヶ所のみでgob.Registerを呼び出していました。)
セッションに構造体を入れたい場合は、gob.Registerをgob.Registerが必要な処理の前に書きましょう。