MST

星途 面试题库

面试题:Go flag包在复杂命令行中如何实现子命令及参数继承

假设要开发一个多功能的命令行工具,比如一个文件管理工具,包含'create'(创建文件)、'delete'(删除文件)等子命令。每个子命令有其特有的参数,同时又有一些公共参数,如'-verbose'(是否输出详细信息)。请使用Go的flag包实现这种子命令结构,并处理好公共参数和子命令特有参数的解析,要求代码结构清晰,能够正确处理各种参数组合的情况。
15.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {
    var verbose bool
    flag.BoolVar(&verbose, "verbose", false, "是否输出详细信息")

    subCommand := flag.NewFlagSet(os.Args[0], flag.ExitOnError)
    createCmd := flag.NewFlagSet("create", flag.ExitOnError)
    var createFileName string
    createCmd.StringVar(&createFileName, "name", "", "创建文件的名称")

    deleteCmd := flag.NewFlagSet("delete", flag.ExitOnError)
    var deleteFileName string
    deleteCmd.StringVar(&deleteFileName, "name", "", "删除文件的名称")

    if len(os.Args) < 2 {
        fmt.Println("请指定子命令,如 create 或 delete")
        os.Exit(1)
    }

    switch os.Args[1] {
    case "create":
        createCmd.Parse(os.Args[2:])
        if createFileName == "" {
            fmt.Println("create 子命令需要指定 -name 参数")
            os.Exit(1)
        }
        handleCreate(verbose, createFileName)
    case "delete":
        deleteCmd.Parse(os.Args[2:])
        if deleteFileName == "" {
            fmt.Println("delete 子命令需要指定 -name 参数")
            os.Exit(1)
        }
        handleDelete(verbose, deleteFileName)
    default:
        fmt.Printf("未知的子命令 %s\n", os.Args[1])
        os.Exit(1)
    }
}

func handleCreate(verbose bool, name string) {
    if verbose {
        fmt.Printf("正在创建文件 %s\n", name)
    }
    // 实际创建文件逻辑
}

func handleDelete(verbose bool, name string) {
    if verbose {
        fmt.Printf("正在删除文件 %s\n", name)
    }
    // 实际删除文件逻辑
}