前提
nextTokenとrequest/responceにpageSizeをrequestのオブジェクトに持つ別の「部分取得」メソッドがありさえすれば「全件取得」ができるようにする方法を探しています。
また、この投稿はマルチポストになります。他の投稿は以下になります。
実現したいこと
以下のようなrequest/responceオブジェクトを持つページ分割されたリスト取得メソッド(=ListSomething)があったとき、
その全結果を取得するためのクラスを作成したいです。
go
1// request リクエストオブジェクト 2type request struct { 3 nextToken *string 4 pageSize int 5} 6 7// responce レスポンスオブジェクト 8type responce struct { 9 nextToken *string 10 rows []interface{} 11} 12 13// MAX ページ分割されたリストの最大値 14var MAX = 20 15 16// ListSomething ページ分割されたリスト取得のサンプルメソッド 17// 指定したpageSize分の数列(0~)を最大20まで出力する 18func ListSomething(request request) responce { 19 var rows []interface{} 20 var nextToken *string 21 22 offset, _ := strconv.Atoi(*request.nextToken) 23 limit := offset + request.pageSize 24 if limit > MAX { 25 limit = MAX 26 nextToken = nil 27 } else { 28 limitStr := strconv.Itoa(limit) 29 nextToken = &limitStr 30 } 31 for i := offset; i < limit; i++ { 32 rows = append(rows, i) 33 } 34 return responce{ 35 rows: rows, 36 nextToken: nextToken, 37 } 38}
発生している問題・エラーメッセージ
クラスのイメージとしては以下のイメージを持っていますが、メソッドやrequest/responceオブジェクトの上手い抽象化の方法が思い浮かびません。
go
1// Looper ページ分割されたリスト取得に関するクラス 2type Looper struct { 3 // 抽象化されたメソッドやrequest/responceオブジェクト 4} 5 6// NewLooper Looperコンストラクタ 7func NewLooper(/*抽象化されたメソッドやrequest/responceオブジェクト*/) *Looper{ 8 return &Looper{ 9 // 抽象化されたメソッドやrequest/responceオブジェクト 10 } 11} 12 13// Loop responce.nextToken == nilまでループして全結果を返却する 14func (l *Looper) Loop() []interface{} { 15 firstToken := "0" 16 nextToken := &firstToken 17 var ans []interface{} 18 19 for { 20 responce := 抽象化されたメソッド( 21 /*抽象化されたリクエスト*/ 22 ) 23 ans = append(ans, responce.rows...) 24 if responce.nextToken == nil { 25 break 26 } 27 nextToken = responce.nextToken 28 } 29 return ans 30}
以下のようなListSomethingA, ListSomethingBが部分取得取得のメソッドでが抽象化の対象になり、共通点はrequestA/requestBにnextTokenとpageSize、responseA/responseBがnextTokenとrowsのメンバ変数を持つことになります。
- ListSomethingA(request requestA) responseA
- ListSomethingB(request requestB) responseB
json.Unmarshal
のような引数にポインタを入れてそこに結果を格納する形でも良いのですがそれでも良い方法がわかりません。
先の例の場合は以下のように実行すると全結果取得ができるイメージです。
go
1fmt.Println(NewLooper(/*ListSomethingAやresponseAやrequestA*/).Loop()) 2// 出力結果: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] 3fmt.Println(NewLooper(/*ListSomethingBやresponceBやrequestB*/).Loop()) 4// 出力結果: [0 1 2 3 4 5 6 7 8 9 10]
補足情報(FW/ツールのバージョンなど)
Go 1.19
