URL Checker - Use Single-Thread

아래 코드는 싱글 스레드를 이용한 방식으로 시간이 많이 걸린다. 파이썬과 같은 방식이라고 보면 된다.

package main

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

var errRequestFailed = errors.New("Requset failed")

func main() {
	var results = make(map[string]string)       //make는 빈 map을 만들어줌, 혹은 var results = map[string]string{} 으로도 가능
	urls := []string{
		"https://www.airbnb.com/",
		"https://www.google.com/",
		"https://www.amazon.com/",
		"https://www.reddit.com/",
		"https://www.google.com/",
		"https://soundcloud.com/",
		"https://www.facebook.com/",
		"https://www.instagram.com/",
		"https://academy.nomadcoders.co/",
	}
	for _, url := range urls {
		result := "OK"
		err := hitURL(url)
		if err != nil {     //에러 발견
			result = "FAILED"
		}
		results[url] = result
	}
	for url, result := range results {
		fmt.Println(url, result)
	}
}

func hitURL(url string) error {
	fmt.Println("Checking:", url)
	resp, err := http.Get(url)
	if err != nil || resp.StatusCode >= 400 {
		fmt.Println(err, resp.StatusCode)
		return errRequestFailed
	}
	return nil
}

Goroutines

간단하게 병렬 처리 방식인 goroutines에 대해 설명하자면 싱글 -> 멀티로 바꿔주는 thread이다.

package main

import (
	"fmt"
	"time"
)

func main() {
	go sexyCount("nico") //goroutines는 main 함수가 작동하는 동안만 유효
	go sexyCount("flynn")
	time.Sleep(time.Second * 5)
}

func sexyCount(person string) {
	for i := 0; i < 10; i++ {
		fmt.Println(person, "is sexy", i)
		time.Sleep(time.Second)
	}
}

병렬 처리를 아주 쉽게 해줄 수 있다는 점이 golang의 장점인 것 같다.