ユアマイスター株式会社エンジニアブログ

ユアマイスター株式会社のエンジニアが日々徒然。

goroutineでRELIVERSにアクセスしてみる

こんにちは!エンジニアインターンの國丸です。今日はgolangを書いてみたく、gouroutineを使って弊社のオウンドメディアであるRELIVERSにアクセスするプログラムを書いたので紹介します。本来はurlの数がもっと多く、channelによる並行度制限が意味を持つのですが、今回は掲載用にurlを減らしています。

package main

import (
    "fmt"
    "net/http"
    "net/http/httputil"
    "time"
)

func main() {
    urls := []string{"https://yourmystar.jp/relivers/cleaning/air-conditioner/air-conditioning-mold/", "https://yourmystar.jp/relivers/cleaning/air-conditioner/air-conditioning-stinking/", "https://yourmystar.jp/relivers/cleaning/air-conditioner/air-conditioning-cleaner/"}

    queue := make(chan int, 10) // 並行度を10に制限

    for i := 0; i < len(urls); i++ {
        queue <- i // チャネルに1つ送信, 既にチャネルのバッファに10ある場合待機

        go func() {
            <-queue // チャネルから1つ受信

            req, _ := http.NewRequest("GET", urls[i], nil)
            req.Header.Set("Referer", urls[(i+1)%len(urls)])

            // リクエスト内容を表示
            dump, _ := httputil.DumpRequestOut(req, true)
            fmt.Printf("%s", dump)

            client := new(http.Client)
            client.Do(req)

        }()

        time.Sleep(100 * time.Millisecond)
    }
}