三个goroutine分别输出张三、李四、王五,使其按上述顺序输出5遍。

package main

import (
	"fmt"
	"sync"
)

var w sync.WaitGroup

func main() {
	w.Add(15)
	chan1 := make(chan struct{}, 0)
	chan2 := make(chan struct{}, 0)
	for i := 0; i < 5; i++ {
		go func() {
			defer w.Done()
			fmt.Println("张三")
			chan1 <- struct{}{}
		}()

		go func() {
			defer w.Done()
			<- chan1
			fmt.Println("李四")
			chan2 <- struct{}{}
		}()

		go func() {
			defer w.Done()
			<- chan2
			fmt.Println("王五")
		}()
	}
	w.Wait()
}

编写程序输出某目录下的所有文件(包括子目录)

package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func main() {
	dir := os.Args[1]
	listAll(dir, 0)
}

func listAll(path string, curHier int) {
	fileInfos, err := ioutil.ReadDir(path)
	if err != nil {
		fmt.Println(err)
		return
	}

	for _, info := range fileInfos {
		if info.IsDir(){
			for tmpHier := curHier; tmpHier > 0; tmpHier-- {
				fmt.Printf("|\t")
			}
			fmt.Println(info.Name(), "\\")
			listAll(path + "/" + info.Name(), curHier + 1)
		} else {
			for tmpHier := curHier; tmpHier > 0; tmpHier-- {
				fmt.Printf("|\t")
			}
			fmt.Println(info.Name())
		}
	}
}