练手写的一个多线程 感觉学的一团糟了 自己理不清了
实在是混乱了 WaitGroup 哪里add 哪里defer done的
还试过channel deadlock 要不就是close channel ...
还有一个for循环里的 goroutine 感觉总是退不出来
直接go 以后 肯定是需要 defer done的 试过几个地方 都不对
或者有没有遇到讲的特别好的教程 给个地址参考一下 谢谢
package main
import (
"bytes"
"fmt"
"io"
"io/ioutil"
"net/http"
"os"
"strings"
"sync"
//"time"
)
//读取当前文件夹下某个文件
func ReadLineFile(fileName string) (urls []string) {
res, err := ioutil.ReadFile(fileName)
if err != nil {
fmt.Println("read file error")
return
}
var allurls = string(res)
urls = strings.Split(allurls, "\r\n")
return urls
}
func download(url string) {
defer wg.Done()
var num = strings.LastIndex(url, "/") //获取最后“/”的索引
var name = url[num+1 : len(url)] //获取文件名
res, err := http.Get(url)
if err != nil {
fmt.Println("get url error")
panic(err)
}
file, err := os.Create(name)
if err != nil {
fmt.Println("create file error")
panic(err)
}
body, _ := ioutil.ReadAll(res.Body)
io.Copy(file, bytes.NewReader(body))
fmt.Printf("下载 %s 完毕...\n", name)
}
func main() {
//该txt文件内容 类似于

//我这两个函数都测试过了 应该是没有问题 公司内部网址 外面也访问不了
var content = ReadLineFile("./pictures.txt")
worklist := make(chan string, 5)
for index := 0; index < len(content); index++ {
downLoad(url)
}
fmt.Print("All done")
}