新手希望练习 goroutine 爬取资源并且实现超时控制,但下列程序无输出。
package main
import (
"net/http"
"io/ioutil"
"fmt"
"time"
)
func fetch(ch chan string){
resp, err := http.Get("http://www.baidu.com")
defer resp.Body.Close()
if err != nil {
panic(err)
}
body, err := ioutil.ReadAll(resp.Body)
ch <-string(body)
}
func main(){
ch := make(chan string)
go fetch(ch)
select {
case <-ch:
fmt.Printf("success\n\t->%s", <-ch)
case <-time.After(3*time.Second):
fmt.Printf("failed\n\t->nil")
}
}
有疑问加站长微信联系(非本文作者)

原来是 channel 不能二次读取,自己发现了。
啥输出都没有?感觉不应该呀!
PS: defer 要放在 err 判断之后。
@channel
改成这样了,因为 case 中读取了一次 ch,之后Printf里面又读取了一次
go社区不能更改自己的回复么,不小心格式没对,我是刚 node 转过来学学 go
233333真不能该,谁加个修改回复的功能啊。。。难受
收到,已记录~
我的意思,
defer resp.Body.Close()
得在之后
老司机!
真的么?我感觉 defer 就是加入先进后出队列应该没关系吧?我不太懂
defer 在 panic之前,会执行defer, 如果在panic之后,则不会
谢谢告知!我测试下