东林博客

Go利用协程操作文件夹及文件读写删教程

初学Go,写了一个简单的小例子,用来学习和巩固Go的一些基础操作,同时也对Go的协程概念有了基础的了解,

例子虽然简单,不过包含了许多Go基础知识点。

package main

import (
   "fmt"
   "log"
   "os"
   "path/filepath"
   "strconv"
   "sync"
)

func main()  {
   var wg sync.WaitGroup
   wg.Add(1)
   var name string;
   fmt.Println("请输入您的姓名:")
   fmt.Scanln(&name)
   fmt.Println("您输入的姓名是:"+name)
   fmt.Println("正在生成十万天兵天将……")
   // 一定要通过指针传值,不然进程会进入死锁状态
   go createSoldier(name,&wg)
   fmt.Println("稍等一会马上就好……")
   wg.Wait()
   // 利用wg.Wait 进行阻塞,运行可以看到,在创建完成前并未执行杀死士兵操作,值得注意的是,deleteSoldier加上go,就不会被执行,因为主协程已经结束了。并没有空闲,所以没有执行deleteSoldier协程。
   go deleteSoldier()
}
/**
创建天兵
 */
func createSoldier(name string,wg *sync.WaitGroup){
   fmt.Println("开始创建中")
   var total = 1000
   for i := 0; i < total; i++{
      // 把数字转为字符串
      index := strconv.Itoa(i)
      file,err := os.Create(name+index+".txt")
      if(err != nil){
         log.Fatal(err)
      }
      file.WriteString(name)
      file.Close()
   }
   fmt.Println("创建完成")
   wg.Done()
}
/**
杀死天兵
 */
func deleteSoldier(){
   fmt.Println("开始杀死天兵");
   pwd,err := os.Getwd()
   if(err != nil){
      log.Fatal(err)
   }
   files,err := filepath.Glob(filepath.Join(pwd,"*.txt"));
   for i := range files{
      os.Remove(files[i])
   }
   // 数字类型转字符串
   var count = strconv.Itoa(len(files))
   fmt.Println("成功杀死了"+count+"个天兵天将")
}

核心点是,利用wg.Wait 进行阻塞,运行可以看到,在创建完成前并未执行杀死士兵操作,值得注意的是,deleteSoldier加上go,就不会被执行,因为主协程已经结束了。并没有空闲,所以没有执行deleteSoldier协程。


{{tip}}