//,入参是一个文件目录,一个INT64的只接收的单向通道   字符串,func  walkDir (dir  fileSizes  chan<作用;int64), {   ,for  _, entry :=, range  dirEntries (dir), {   if 才能;entry.IsDir (), {   ,,subdir :=, filepath.Join (dir, entry.Name ())   ,,walkDir(子目录,文件大小)   ,,},{else    ,,fileSizes  & lt;作用;entry.Size ()   ,,}   ,}   }

这里我们定义一个目录,然后需求传入一个单向接收通道用于在多goroutine中计算总共的文件大小。

使用范围方法来遍历我们上面写的dirEntries的返回文件或文件夹,如果是文件夹则继续迭代。

如果不是则将文件大小存入放入文件大小通道中。

搞定上面两个函数,我们来写主函数部分:

func 主要(),{   ,root :=,““   ,flag.StringVar(和根,“-p",,“管理者”,,,“input  dir !”)   ,flag.Parse ()   ,fileSizes :=, (chan  int64)   ,//起一个goroutine去走目录   ,go  func (), {   walkDir才能(根,文件大小)//,才能走完毕之后要关闭该频道下面使用读范围取数据的时候才会有尽头   关闭才能(文件大小)   ,}()   ,var  nfile nbytes  int64   ,for  size :=, range  fileSizes  {   ,nfile + +   nbytes 才能+=,大小   ,}   ,fmt.Printf (“% d  files  % .1f  GB \ n",, nfile,, float64 (nbytes)/1 e9)   }

这里注意一点,因为起goroutine的走函数,和下面同时在范围遍历是在同步进行,如果下面范围速度太快读到管道里面没有值了会阻塞住等待有数据继续进来之后读取,而不是会跳出。只有当关闭(文件大小)这句执行到,显示关闭掉频道之后,才会跳出范围循环并且这时已经读取完了所有的数据。这里有点像,关闭通道的时候给范围发送了一个停止信号一样,感觉这个利用起来会比较有用?后续可能会再研究一下。