

### 前提

nextTokenとrequest/responceにpageSizeをrequestのオブジェクトに持つ別の「部分取得」メソッドがありさえすれば「全件取得」ができるようにする方法を探しています。  
また、この投稿はマルチポストになります。他の投稿は以下になります。

  * <https://stackoverflow.com/questions/74782804>
  * <https://teratail.com/questions/b3mu9w40b2so3l>

### 実現したいこと

以下のようなrequest/responceオブジェクトを持つページ分割されたリスト取得メソッド(=ListSomething)があったとき、  
その全結果を取得するためのクラスを作成したいです。

[code]

    // request リクエストオブジェクト
    type request struct {
        nextToken *string
        pageSize  int
    }
    
    // responce レスポンスオブジェクト
    type responce struct {
        nextToken *string
        rows      []interface{}
    }
    
    // MAX ページ分割されたリストの最大値
    var MAX = 20
    
    // ListSomething ページ分割されたリスト取得のサンプルメソッド
    // 指定したpageSize分の数列(0~)を最大20まで出力する
    func ListSomething(request request) responce {
        var rows []interface{}
        var nextToken *string
    
        offset, _ := strconv.Atoi(*request.nextToken)
        limit := offset + request.pageSize
        if limit > MAX {
            limit = MAX
            nextToken = nil
        } else {
            limitStr := strconv.Itoa(limit)
            nextToken = &limitStr
        }
        for i := offset; i < limit; i++ {
            rows = append(rows, i)
        }
        return responce{
            rows:      rows,
            nextToken: nextToken,
        }
    }
    
[/code]

### 発生している問題・エラーメッセージ

クラスのイメージとしては以下のイメージを持っていますが、メソッドやrequest/responceオブジェクトの上手い抽象化の方法が思い浮かびません。

[code]

    // Looper ページ分割されたリスト取得に関するクラス
    type Looper struct {
        // 抽象化されたメソッドやrequest/responceオブジェクト
    }
    
    // NewLooper Looperコンストラクタ
    func NewLooper(/*抽象化されたメソッドやrequest/responceオブジェクト*/) *Looper{
        return &Looper{
            // 抽象化されたメソッドやrequest/responceオブジェクト
        }
    }
    
    // Loop responce.nextToken == nilまでループして全結果を返却する
    func (l *Looper) Loop() []interface{} {
        firstToken := "0"
        nextToken := &firstToken
        var ans []interface{}
    
        for {
            responce := 抽象化されたメソッド(
                /*抽象化されたリクエスト*/
            )
            ans = append(ans, responce.rows...)
            if responce.nextToken == nil {
                break
            }
            nextToken = responce.nextToken
        }
        return ans
    }
    
[/code]

以下のようなListSomethingA,
ListSomethingBが部分取得取得のメソッドでが抽象化の対象になり、共通点はrequestA/requestBにnextTokenとpageSize、responseA/responseBがnextTokenとrowsのメンバ変数を持つことになります。

  * ListSomethingA(request requestA) responseA
  * ListSomethingB(request requestB) responseB  
`json.Unmarshal`のような引数にポインタを入れてそこに結果を格納する形でも良いのですがそれでも良い方法がわかりません。  
先の例の場合は以下のように実行すると全結果取得ができるイメージです。

[code]

    fmt.Println(NewLooper(/*ListSomethingAやresponseAやrequestA*/).Loop())
    // 出力結果: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
    fmt.Println(NewLooper(/*ListSomethingBやresponceBやrequestB*/).Loop())
    // 出力結果: [0 1 2 3 4 5 6 7 8 9 10]
    
[/code]

### 補足情報（FW/ツールのバージョンなど）

Go 1.19


CC BY-SA 4.0
2022-12-12T15:10:42.080
92728
2022-12-14T14:59:59.027
2022-12-14T14:59:59.027
16974
16974
question
go api
ページ分割されたリスト取得APIの全結果取得をGo言語でクラス化したい