いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-217 (RSS 2.0 を読み込むサンプル)

概要

たまーに使うことがあるので、忘れないうちにメモメモ。

Goでは、JSONと同じようにXMLの場合も Struct Tags を付与できるので、解析がとても楽ですね。

試すサイトは、他サイト様にすると迷惑がかかるので、このブログにしました。

package main

import (
    "encoding/xml"
    "fmt"
    "io"
    "net/http"
)

type (
    Item struct {
        XMLName xml.Name `xml:"item"`
        Title   string   `xml:"title"`
    }
    Rss struct {
        XMLName xml.Name `xml:"rss"`
        Items   []Item   `xml:"channel>item"`
    }
)

const (
    URL = "https://devlights.hatenablog.com/rss"
)

func panicOnErr[T any](v T, err error) T {
    if err != nil {
        panic(err)
    }

    return v
}

// ブログ [いろいろ備忘録日記](https://devlights.hatenablog.com/) から RSS 2.0 を取得して表示するサンプルです。
//
// REFERENCES:
//   - https://qiita.com/you8/items/e903fd463cf770688e1e
func main() {
    fmt.Printf("[URL] %s\n", URL)

    resp := panicOnErr(http.Get(URL))
    body := panicOnErr(io.ReadAll(resp.Body))
    defer resp.Body.Close()

    var rss Rss
    if err := xml.Unmarshal(body, &rss); err != nil {
        panic(err)
    }

    for i, item := range rss.Items {
        fmt.Printf("[%2d] %s\n", i+1, item.Title)
    }
}

go-taskのタスクファイルは以下。

version: '3'

tasks:
  default:
    cmds:
      - task: run
  install-lib:
    cmds:
      - go install golang.org/x/tools/cmd/goimports@latest
      - go install honnef.co/go/tools/cmd/staticcheck@latest
  build:
    deps: [ install-lib ]
    cmds:
      - goimports -w .
      - go vet
      - staticcheck
      - go build
  run:
    deps: [ build ]
    cmds:
      - ./rss2

実行すると以下のようになります。

gitpod /workspace/try-golang (master) $ task -d examples/singleapp/rss2/
task: [install-lib] go install golang.org/x/tools/cmd/goimports@latest
task: [install-lib] go install honnef.co/go/tools/cmd/staticcheck@latest
task: [build] goimports -w .
task: [build] go vet
task: [build] staticcheck
task: [build] go build
task: [run] ./rss2
[URL] https://devlights.hatenablog.com/rss
[ 1] SQLcl (Oracle SQL Developer Command Line, SQL*Plusのモダンな版)
[ 2] Github codespaces が Prebuild に対応 (Prebuilding codespaces is generally available)
[ 3] grepコマンド チートシート (Grep cheatsheet)
[ 4] Dragonfly (Redis互換でio_uringを使うインメモリデータストア)
[ 5] Windowsで手軽にgifを作れるツール (ScreenToGif)
[ 6] Java の 1.0 から 18 までの歴史 (Java history from Java 1.0 to Java 18)
[ 7] Goメモ-213 (runtime.Goschedについて)(yield, 実行権の放棄)
[ 8] vimで very magic検索 (\v) を使って検索
[ 9] vimで検索時にキャプチャせずにカッコを使う
[10] Goメモ-212 (log.Fatalとlog.Panicの違い)
[11] Goメモ-211 (The Go Programming Language and Environment)(Goの作者5人による寄贈記事)
[12] Cypress公式のラーニングコースプログラム (Real World Testing with Cypress)
[13] Goメモ-210 (golang.org/x/exp/maps)(Go 1.18 リリース時には含まれなかった汎用マップ処理)
[14] Goメモ-209 (golang.org/x/exp/slices)(Go 1.18 リリース時には含まれなかった汎用スライス処理)
[15] Goメモ-208 (golang.org/x/exp/constraints)(Go 1.18 リリース時には含まれなかった制約型)
[16] Goメモ-207 (sliceの3つ目のインデックスパラメータの使い方)
[17] Makefile内でプロセスを起動して後からそのプロセスをkillするやり方
[18] Microsoft Build 2022 の気になった記事
[19] Goメモ-206 (sliceにデータを追加する際のパフォーマンス比較について)
[20] Goメモ-205 (ジェネリクスを使うとき・使わないときの指針)
[21] Goメモ-204 (windowsでexe実行時にコマンドプロンプトが出ないようにビルド, windowsgui)
[22] Goメモ-203 (Goで非同期処理する際のガイドブック的な資料, go-concurrency-guide)
[23] vim で :terminal を垂直分割して表示したい場合
[24] Goメモ-202 (type alias と defined type の違い)
[25] Gitpod の Chrome 拡張機能が jihulab.com へのアクセスをいきなり求めてきた
[26] Goメモ-201 (無償で読めるGoの電子書籍 (softchris/golang-book))
[27] VSCode の ver.1.67 でマークダウン編集時にShift+ドロップでリンク自動生成してくれるようなった 
[28] Gitpod と JetBrains Gateway が連携するようになった
[29] Flutterメモ-27 (Flutter 3 リリース, macOS/Linux デスクトップが stable に)
[30] makeでコマンド実行中にエラーが出ても処理を継続するやり方 (--keep-going, || :)

参考情報


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。