Upgrade to Pro — share decks privately, control downloads, hide ads and more …

パッケージ設計の黒魔術/Kyoto.go#63

 パッケージ設計の黒魔術/Kyoto.go#63

黒魔術の話です

Avatar for kadota kyohei

kadota kyohei

August 31, 2025
Tweet

More Decks by kadota kyohei

Other Decks in Programming

Transcript

  1. Offset type User struct { ID int Active bool Name

    string } 5 ID Offset 0 未使用(アラインメント) Active Name Offset 8 Offset 16
  2. 使い方 p0 := reflect.ValueOf(&u).Pointer() p1 := reflect.ValueOf(&u.Active).Pointer() off := p1

    - p0 for _, f := range reflect.VisibleFields(reflect.TypeOf(u)) { if f.Offset == off { fmt.Println(f.Name) // Output: Active } } 6
  3. 何が嬉しいの 型パラメータと一緒に使うと型を残せる func Assert[T, F any](u T, p *F) Equaler[F]

    Assert(u, &u.Name).Equal(“example”) 7 型を間違えると ビルドエラー
  4. よくあるやつ type User struct { ID int `json:”id” validate:”qte=1”` Name

    string `json:”name” validate:”required”` } 文字列で指示するものは同じ問題が起きがち 8 長くなりがち typoしても気づかない
  5. go-dynoの使用例 iface, err := dyno.Dynamic[io.Reader](handleMethod) func handleMethod( method reflect.Method, args

    []reflect.Value, ) []reflect.Value { return nil } 20 メソッド名が取れる 引数も取れる 実装したいインターフェイス