3. URL Checker

channel, goroutine practice

nomadCoder 강의 실습 #3

  1. main.go

package main

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

type requestResult struct {
	url    string
	status string
}

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

func main() {
	c := make(chan requestResult)
	results := make(map[string]string)

	urls := []string{
		"https://www.airbnb.com/",
		"https://www.google.com/",
		"https://www.amazon.com/",
		"https://www.reddit.com/",
		"https://soundcloud.com/",
		"https://www.facebook.com/",
		"https://www.instagram.com/",
		"https://academy.nomadcoders.co/",
	}

	for _, url := range urls {
		go hitURL(url, c)
	}
	for i := 0; i < len(urls); i++ {
		result := <-c
		results[result.url] = result.status
	}
	for url, status := range results {
		fmt.Println(url, status)
	}

}

func hitURL(url string, c chan<- requestResult) {
	resp, err := http.Get(url)
	status := "OK"
	if err != nil || resp.StatusCode >= 400 {
		status = "FAILED"
	}
	c <- requestResult{url: url, status: status}
}

map 초기화 하기.

  • var results = make(map[string]string)

    • make는 map을 초기화 시켜주는 함수이다.

  • var results = map[string]string{}

    • map을 정의하고 끝에 {}를 넣어 빈 값으로 초기화 시켜준다.

  • var results map[string]string

    • 이렇게 하면 map이 초기화 되지 않아서 results에 어떤 값을 넣으려고 할 때 compiler가 panic한다.

goroutine

  • main function이 존재하는 동안만 유효하다.

  • main function은 goroutine을 기다려주지 않는다.

channel

  • goroutine과 main 혹은 goroutine과 goroutine 사이에 커뮤니케이션 할 수 있게 해줌.

  • 아래는 아주 간단한 goroutine, channel 예제이다.

  • 함수 안에서 channel c에 값을 넘겨주고 <-c로 main funtion에서 어떤 값이 나오는지 기다린다. (blocking operation)

  • channel에 2개의 값만 넣었는데 <-c를 3개 한다면 main 함수는 마지막 1개의 값이 나오지 않아서 계속 기다린다. 혹은 dead lock에 걸린다.

  • func foo(c chan<- bool){} 이런식으로 선언하면 해당 채널은 send-only 라는 뜻이다.

package main

import (
	"fmt"
	"time"
)

func main() {
	c := make(chan bool)
	people := [2]string{"taeha", "nico"}
	for _, person := range people {
		go isSexy(person, c)
	}
	fmt.Println(<-c)
	fmt.Println(<-c)
}

func isSexy(person string, c chan bool) {
	time.Sleep(time.Second * 5)
	fmt.Println(person)
	c <- true
}

Go packages

Last updated