Goの構造体内のinterface{}型のフィールドにはどうアクセスすればいいのか?
SQLファイルから型安全なコードを自動してくれるsqlcというライブラリを使用してアプリ開発を行っているのですが、sqlcで以下のようなsqlよりgenerateを実行すると
-- name: GetUsers :many SELECT id, case when name = "foo" then true when name = "bar" then false end as flag FROM users ; ...
以下のようにFlagはinterface{}
型のフィールドとして構造体が生成されます。
このような場合の値の取得方法がシュッとわからなかったのでChatGPTに聞いてみました。
// Code generated by sqlc. DO NOT EDIT. ... type GetUsersRow struct { ID int64 Flag interface{} }
ChatGPTで得た回答
Flagにアクセスしたい場合は以下のように型アサーションを行うことで取得することができました。
users, _ := x.Querier.GetUsers(ctx, x.DB) for _, u := range users { var tmp = u.Flag.(bool) ... }
ただしここで気をつける点としては型アサーションに与えた型が適切でなかった場合にpanicになる可能性があります。
このあたりはA tour of GoのType assertionsにも出てくる内容のようで、 型アサーションしてアクセスする場合はより安全にアクセスする方法として以下のような処理で行うほうが安全のようでした。
t, ok := i.(T)