あいつの日誌β

働きながら旅しています。

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

こちらからは以上です。