package main

import (
	"errors"
	"fmt"
	"os"
)

var ErrFileNotFound = errors.New("file not found")

func panicHandler() {
	fmt.Println("panic handler")
	if r := recover(); r != nil {
		fmt.Println("Recovered from panic:", r)
		os.Exit(1)
	}
}

func main() {
	defer panicHandler()

	// if r := recover(); r != nil {
	// 	fmt.Println("Recovered from panic:", r)
	// 	os.Exit(1)
	// }

	// 变量目录, 打印了文件名称
	err := walkDir("./xxxx", func(filePath string) {
		fmt.Println(filePath)
	})

	if err != nil {
		if errors.Is(err, os.ErrNotExist) {
			fmt.Println("not exist", err)
		} else {
			fmt.Printf("%s", err)
		}
		// os.Exit(1)
	}

	// 初始化数据库，连接数据库
	defer func() {
		// db.Close()
		fmt.Println("关闭数据库连接")
	}()

	// pannic
	// arrs := []int{1, 2, 3}
	// fmt.Println(arrs[4])

	// if r := recover(); r != nil {
	// 	fmt.Println("Recovered from panic:", r)
	// 	os.Exit(1)
	// }

	// 启动API服务器 HTTP Server
	defer func() {
		// httpServer.Shutdown()
		fmt.Println("关闭HTTP服务器")
	}()
}

// 最常见的就是 遍历目录里面的文件
func walkDir(path string, fn func(string)) error {
	files, err := os.ReadDir(path)
	if err != nil {
		return errors.Join(errors.New("walkDir error"), err)
	}

	// 读取path目录下的文件和子目录
	for _, file := range files {
		// 如果是目录， 继续往下找
		if file.IsDir() {
			walkDir(path+"/"+file.Name(), fn)
		} else {
			// 文件， 调用fn函数处理
			fn(path + "/" + file.Name())
		}
	}

	return nil
}
