ユーザーアイコン

mizuko

20日前

0
0

Goにおけるboolポインタ型とインライン関数の活用

Go

Goで構造体のフィールド型をboolから*bool(ポインタ型)に変更した場合、直接リテラル値を代入することができない。これはGoの型システムの特性によるもので、ポインタ型には変数のメモリアドレスを渡す必要がある。

今回の修正では、インライン関数を使用して問題を解決した。具体的には以下のコード:

IsPublic: func() *bool { b := true; return &b }(),

このパターンはその場で無名関数を定義・実行し、bool値のポインタを生成して返す。関数内でローカル変数を作成し、そのアドレスを返すことでポインタ値を得ている。

他の解決方法としては:

  1. 一時変数を使用: isPublicValue := true; &isPublicValue
  2. ヘルパー関数を定義: func boolPtr(b bool) *bool { return &b }

また、ポインタ型のフィールドを条件分岐で使用する際は、nilチェックと値の参照を適切に行う必要がある:

if params.IsPublic != nil { query = query.Where("m.is_public = ?", *params.IsPublic) }