Go 程序设计语言(Go语言圣经)书中并没有完整的调用代码,搜索也没有找到对应的代码,特此记录。 需要注意的点是 range channel 的时候,通道最后一定要关闭,不关闭就会导致死锁
package main
import (
"fmt"
"io/ioutil"
"log"
"sync"
)
func main() {
fmt.Println("===== makeThumbnails6 =====")
fileListCh := make(chan string, 5)
go func() {
var fileName string
for {
fmt.Scanln(&fileName)
if fileName == "end" {
close(fileListCh)
return
}
go func(fileName string) {
fileListCh <- fileName
log.Println("fileList send ->", fileName)
}(fileName)
}
}()
log.Println("main for end")
total := makeThumbnails(fileListCh)
log.Println("total: ", total)
log.Println("main end")
}
func makeThumbnails(filenames chan string) int {
sizes := make(chan int)
var wg sync.WaitGroup
for f := range filenames {
log.Println("filename: <- ", f)
wg.Add(1)
go func(f1 string) {
defer wg.Done()
file, err := readFile(f1)
if err != nil {
log.Println(err)
return
}
len2 := len(file)
log.Printf("fileName: [%s], size: %d", f1, len2)
sizes <- len2
}(f)
}
log.Println("range filename end")
go func() {
wg.Wait()
close(sizes)
}()
var total int
for size := range sizes {
total += size
}
log.Println("sizes end")
return total
}
// 为了代码篇幅,将书中的这部分代码换成了读文件大小
func readFile(f string) ([]byte, error) {
return ioutil.ReadFile(f)
}