アプリのレビューを楽に集計したい〜

開発環境

> docker-compose exec app go version
go version go1.17.6 linux/amd64

つくったもの

tokizuoh/ceraxus

> docker-compose exec app go run main.go 340368403
2022/01/08 08:59:55 SUCCESSED!

> cat tmp.csv | head -n 5
id,version,name,date,title,content
8196587123,2021.51.0,{USER_NAME},2022-01-02T10:01:57-07:00,趣味として,コロナ禍の影響からか、料理をする機会が増えた。なので、更に自炊のレパートリーを増やす為、研究資料として活用させて頂きたいと思う
8187019395,2021.51.0,{USER_NAME},2021-12-30T20:27:10-07:00,初心者に不親切な中級者向け,クックパッドで失敗せん人は多分自信ないだけで自力で料理作れる動画や画像が無くて表現が曖昧な所ばっかりで初めて作るものは基本失敗する別の料理アプリの方がお勧め
8184007104,2021.51.0,{USER_NAME},2021-12-30T01:01:09-07:00,改悪続き。,長年有料会員ですが、検索機能が役に立たない。出てきたと思ったら10件しか表示されない。ハッシュタグ機能も邪魔。買い物機能?地域限定のカテゴリって必要?暫く長い目で見てたけどいい加減見切りつけたほうがいい時期かな。
8158446432,2021.51.0,{USER_NAME},2021-12-22T14:59:29-07:00,メモ機能希望,もう何年もお世話になっています。これがなかったらうちの食事は崩壊していたと思うぐらい感謝しています。家族の好みに合わせて、砂糖は大さじ1に、とか、このレシピにはにんにくプラス、とか、自分の家の電子レンジだとあと10分プラス、みたいなメモを書く欄があったらもっと使いやすくなるなぁといつも思っています。期待を込めて星3つで!

クックパッドさんのレビューを取得した例

duplicate field Attributes

type AutoGenerated struct {
	Feed struct {
        // 省略
		Link []struct {
			Attributes struct {  
				Rel  string `json:"rel"`
				Type string `json:"type"` // 先頭のみ`Type`が存在
				Href string `json:"href"`
			} `json:"attributes,omitempty"`
			Attributes struct {
				Rel  string `json:"rel"`
				Href string `json:"href"`
			} `json:"attributes,omitempty"`
			Attributes struct {
				Rel  string `json:"rel"`
				Href string `json:"href"`
			} `json:"attributes,omitempty"`
			Attributes struct {
				Rel  string `json:"rel"`
				Href string `json:"href"`
			} `json:"attributes,omitempty"`
			Attributes struct {
				Rel  string `json:"rel"`
				Href string `json:"href"`
			} `json:"attributes,omitempty"`
			Attributes struct {
				Rel  string `json:"rel"`
				Href string `json:"href"`
			} `json:"attributes,omitempty"`
		} `json:"link"`
        // 省略
	} `json:"feed"`
}

JSON-to-Go で対象のレスポンス(JSON)をGoのstructに変換して実行すると、nil許容が考慮されていないfieldが存在する影響でエラーが発生する。

> docker-compose exec app go run main.go 340368403
# model
model/model.go:81:4: duplicate field Attributes

 

nil許容のfield定義が必要。

nil許容のfield定義

結論は以下。

type AutoGenerated struct {
	Feed struct {
        // 省略
		Link []struct {
            Attributes struct {
                Rel  string       `json:"rel"`
                Type interface{}  `json:"type"` // ココ!
                Href string       `json:"href"`
            } `json:"attributes,omitempty"`
        } `json:"link"`
        // 省略
	} `json:"feed"`
}

go には型としてのnil許容の概念が標準で無いため、interface{} で代用。

(interface{} ってなんだっけ?)

Any型っぽい使い方ができたり、(上記の結論)

package main

import (
	"fmt"
	"strings"
)

func main() {
	raw := interface{}("HOGE")
	hoge := raw.(string)
	fmt.Println(strings.ToLower(hoge)) // hoge
}

 

Swift の protocol と似た振る舞いもする。

package main

import (
	"fmt"
)

type animal interface {
	run()
}

type human struct{}

func (h human) run() {
	fmt.Println("RUN!!")
}

func run2(a animal) {
	a.run()
}

func main() {
	var h human
	run2(h) // RUN!!
}

参考