MST
星途 面试题库

面试题:Go flag包命令的复杂应用

假设你要开发一个Go语言的命令行备份工具,使用flag包实现以下功能:支持指定源目录、目标目录、是否压缩备份文件(布尔型参数)以及备份文件的前缀名(字符串参数)。如果目标目录不存在则自动创建,并且在备份完成后打印备份成功的提示信息。请写出完整的代码实现思路及关键代码。
18.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 代码实现思路
    • 导入必要的包,包括flag用于处理命令行参数,fmt用于格式化输出,os用于操作系统相关操作,path/filepath用于处理文件路径。
    • 使用flag包定义源目录、目标目录、是否压缩和备份文件前缀名的参数。
    • 解析命令行参数。
    • 检查目标目录是否存在,不存在则创建。
    • 实现备份逻辑,根据是否压缩决定备份方式。
    • 备份完成后打印成功提示信息。
  2. 关键代码
package main

import (
    "flag"
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    var sourceDir string
    var targetDir string
    var compress bool
    var prefix string

    flag.StringVar(&sourceDir, "s", "", "源目录")
    flag.StringVar(&targetDir, "t", "", "目标目录")
    flag.BoolVar(&compress, "c", false, "是否压缩备份文件")
    flag.StringVar(&prefix, "p", "", "备份文件的前缀名")

    flag.Parse()

    if sourceDir == "" || targetDir == "" {
        fmt.Println("源目录和目标目录不能为空")
        return
    }

    // 检查目标目录是否存在,不存在则创建
    if _, err := os.Stat(targetDir); os.IsNotExist(err) {
        err := os.MkdirAll(targetDir, 0755)
        if err != nil {
            fmt.Printf("创建目标目录失败: %v\n", err)
            return
        }
    }

    // 这里省略具体的备份实现逻辑,以打印信息代替
    fmt.Printf("从 %s 备份到 %s,是否压缩: %v,前缀名: %s\n", sourceDir, targetDir, compress, prefix)
    fmt.Println("备份成功")
}

上述代码定义了命令行参数,检查了目标目录并给出了简单的备份成功提示。实际备份逻辑(如文件复制、压缩等)需要根据具体需求进一步实现。