を引数として組み替えて、戻り値を型パラメータT にする func Do[T any](ctx context.Context, t *Tx, f func (ctx context.Context, tx *sql.Tx) (T, error)) (T, error) { ... } func main() { ctx := context.Background() t := Tx{ ... } // *model.User を戻り値の型に出来る & 型推論が効くので、型引数の指定が不要 result, err := Do(ctx, t, func (ctx context.Context, tx *sql.Tx) (*model.User, error){ ... return &model.User{ ... }, nil }) if err != nil { ... } fmt.Println(u.Name) // 型アサーションが不要 }