Go makeThumbnails6 代码

309 阅读1分钟

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)
}