はわわーっ

はわわわわっ

golangしてみる(続き

ゴルーチンを使ってみるよ。

まず、ゴルーチンなしの場合。

package main

import (
        "fmt"
        "log"
        "net/http"
)

func main() {
        urls := []string{
                "http://example.com",
                "http://example.net",
                "http://example.org",
        }
        for _, url := range urls {
                res, err := http.Get(url)
                if err != nil {
                        log.Fatal(err)
                }
                defer res.Body.Close()
                fmt.Println(url, res.Status)
        }
}

ゴルーチン使う場合。

package main

import (
        "fmt"
        "log"
        "net/http"
        "sync"
)

func main() {
        wait := new(sync.WaitGroup)
        urls := []string{
                "http://example.com",
                "http://example.net",
                "http://example.org",
        }
        for _, url := range urls {
                wait.Add(1)
                go func(url string) {
                        res, err := http.Get(url)
                        if err != nil {
                                log.Fatal(err)
                        }
                        defer res.Body.Close()
                        fmt.Println(url, res.Status)
                        wait.Done()
                }(url)
        }
        wait.Wait()
}

チャネルを使ってゴルーチン間でやりとりする場合。

package main

import (
        "fmt"
        "log"
        "net/http"
)

func getStatus(urls []strings) <-chan string {
        statusChan := make(chan string)
        for _, url := range urls {
                go func(url string) {
                        res, err := http.Get(url)
                        if err != nil {
                                log.Fatal(err)
                        }
                        defer res.Body.Close()
                        statusChan <- res.Status
                }(url)
        }
        return statusChan
}

func main() {
        urls := []string{
                "http://example.com",
                "http://example.net",
                "http://example.org",
        }
        statusChan := getStatus(urls)
        for i := 0; i < len(urls); i++ {
                fmt.Println(<-statusChan)
        }
}