struct 뿐만 아니라, dictionary도 type으로 사용할 수 있다.
search에서 err를 return 한다면 값이 없다는 이야기니까, 값을 넣을 수 있다.
만약 err가 nil 이라면 값이 있다는 이야기이므로 err를 return 해야한다.
위와 같이 var을 묶어서 선언할 수 있다.
hit = 웹 서버의 파일 1개에 접속하는 것을 의미
var result = make(map[string]string)
var result = map[string]string{}
위의 예에서 위와 아래의 코드는 동일하다.
make()는 map함수를 empty값으로 로 초기화 시켜준다. 초기화를 시키지 않을 시 map은 nil이 돼버린다. map이 된 nil에는 어떤 값도 넣을 수 없다.
var result = map[string]string
result["안녕"] = "얼쑤"
만약 위와 같이 초기화(empty 상태)를 하지 않고 값을 넣으려고 하면
컴파일러에는 걸리지 않지만 error를 반환하게 된다.
package main
import (
"errors"
"fmt"
"net/http"
)
var errRequestFailed = errors.New("리퀘스트 실패")
func main() {
var results = make(map[string]string)
urls := []string{
"https://www.google.com",
"https://www.naver.com",
"https://www.facebook.com",
"https://www.instagram.com",
"https://www.airbnb.com",
"https://www.amazon.com",
"https://soundcloud.com",
}
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
}
resp.StatusCode >= 400
위와 같이 statusCode가 400이상이면 에러다! 라고 조건문을 체크하는것은 GO의 신기한 점이다.
성공적으로 방문했다면 map에 OK를 담고, 아니라면 FAILED를 담는다. 성공과 실패는 err가 nil인지 아닌지를 보고 판단할 수 있다.
결과
그러나 이렇게 동기적으로 실행하는 것은 파이썬이나 JS에서 주로 돌아가는 방식인데, 비효율적이다.
GO에서는 비동기적으로 더 빠르게 처리할 수 있다.