App Enigine に deploy しよとすると composite literal uses unkeyed fields と言われた件
あらすじ
ある日手元で開発したソースコードを App Engine にデプロイしようとするとエラーが出たときのお話です。
問題と解決策
問題となったのは以下のコード
func NewNullString(s string) NullString { return NullString{sql.NullString{s, s != ""}} }
ここは以下のように書き直すと deploy できました。
func NewNullString(s string) NullString { return NullString{sql.NullString{ String: s, Valid: s != "", }} }
解説
手元ではコンパイルできるんだけど App Engine にデプロイできない理由は App Engine 側でコンパイル前にエラーチェックをしていてそれに引っかかっている事が原因のようです。
表示されたエラーの意味は composite struct literal database/sql.NullString with unkeyed fields
で struct を複数合わせ技を使っているので 「unkeyed fields 使っているけど大丈夫なのかい?んん?」と言っているようです。
で、そのエラーの発言主は go-vet
です。このコマンドはコンパイラで見つけられないエラーを検出することができます。
実際にこのコマンドを手元の MacOSX で実行すると同じエラーが表示されます。
% go tool vet model/model.go model/model.go:31: database/sql.NullString composite literal uses unkeyed fields
別の解法としてはそのチェックをしないようにしても良いです。ただ私は前述の解決策で良いので App Engine 側でチェックの可否をコントロールする方法はよくわかってないです。
% go tool vet --composites=false model/model.go # 怒られない % go tool vet --composites=true model/model.go # 怒られる model/model.go:31: database/sql.NullString composite literal uses unkeyed fields
こちらからは以上です。