Go - 04. URL Checker (1)
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의 장점인 것 같다.