Я совсем новичок в golang
. Так что, пожалуйста, избавьте меня от меча (если возможно).
Я пытался получить данные из Интернета, изучая учебник здесь
Теперь, учебное пособие идет хорошо, но я хотел проверить крайние случаи и обработку ошибок (просто чтобы быть внимательным с моим новым изучением языка, не хочу быть тем, у кого половиназапеченные знания).
Вот мой код игровой площадки .
Прежде чем спросить, я просмотрел множество ссылок, таких как:
- Перейти блог отложить, паниковать и восстановить
- обработка паники в goroutines
- как следует писать-goroutine
И еще несколько, однако я не мог этого понять.
Вот код на тот случай, если вы не хотите идти на игровую площадку (по причинам, пока неизвестнымчеловек):
// MakeRequest : Makes requests concurrently
func MakeRequest(url string, ch chan<- string, wg *sync.WaitGroup) {
start := time.Now()
resp, err := http.Get(url)
defer func() {
resp.Body.Close()
wg.Done()
if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
}
}()
if err != nil {
fmt.Println(err)
panic(err)
}
secs := time.Since(start).Seconds()
body, _ := ioutil.ReadAll(resp.Body)
ch <- fmt.Sprintf("%.2f elapsed with response length: %d %s", secs, len(body), url)
}
func main() {
var wg sync.WaitGroup
output := []string{
"https://www.facebook.com",
"",
}
start := time.Now()
ch := make(chan string)
for _, url := range output {
wg.Add(1)
go MakeRequest(url, ch, &wg)
}
for range output {
fmt.Println(<-ch)
}
fmt.Printf("%.2fs elapsed\n", time.Since(start).Seconds())
}
Обновление
Я изменил код, чтобы (скажем так) обрабатывать ошибку в goroutine, как это ( go-plays here ):
func MakeRequest(url string, ch chan<- string, wg *sync.WaitGroup) {
start := time.Now()
resp, err := http.Get(url)
if err == nil {
secs := time.Since(start).Seconds()
body, _ := ioutil.ReadAll(resp.Body)
ch <- fmt.Sprintf("%.2f elapsed with response length: %d %s", secs, len(body), url)
// fmt.Println(err)
// panic(err)
}
defer wg.Done()
}
Обновление 2:
После ответа я изменил код на этот, и он успешно удаляет тупик chan
, однако теперь мне нужно с этим справитьсяв main
:
func MakeRequest(url string, ch chan<- string, wg *sync.WaitGroup) {
defer wg.Done()
start := time.Now()
resp, err := http.Get(url)
if err == nil {
secs := time.Since(start).Seconds()
body, _ := ioutil.ReadAll(resp.Body)
ch <- fmt.Sprintf("%.2f elapsed with response length: %d %s", secs, len(body), url)
// fmt.Println(err)
// panic(err)
}
// defer resp.Body.Close()
ch <- fmt.Sprintf("")
}
Нет ли более элегантного способа справиться с этим?
Но теперь я зашел в тупик.
Спасибо и всего наилучшего.
Temporarya
(Новичок Голанга)