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)