Like Share Discussion Bookmark Smile

J.J. Huang   2025-06-28   Getting Started Golang 07.套件   瀏覽次數:次   DMCA.com Protection Status

Go | 命令套件的函式與介紹

💬 簡介

在開發命令列應用(CLI)時,處理使用者輸入的參數是基本而必要的功能。
Go 語言內建的 flag 套件提供一個簡潔的方式來解析命令列參數,讓我們可以快速開發具有互動性的 CLI 工具。

本篇將介紹 flag 套件的常用函式與實作方式,包含基本參數定義、解析與應用範例,協助你輕鬆實作實用的命令列介面。

圖片來源:Gophers


💡 基本用法

🚩 定義與解析參數

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import (
"flag"
"fmt"
)

func main() {
name := flag.String("name", "Gopher", "使用者名稱")
age := flag.Int("age", 18, "使用者年齡")
verbose := flag.Bool("v", false, "顯示詳細訊息")

flag.Parse()

fmt.Println("Name:", *name)
fmt.Println("Age:", *age)
fmt.Println("Verbose:", *verbose)
}

🚀 執行方式

1
go run main.go -name=Alice -age=30 -v

🧱 支援的參數型別

資料型別 宣告函式
字串 flag.String()
整數 flag.Int()
布林 flag.Bool()
浮點數 flag.Float64()
時間長度 flag.Duration()

🔨 範例:實作簡易命令工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

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

func main() {
input := flag.String("input", "", "輸入檔案路徑")
output := flag.String("output", "", "輸出檔案路徑")
dryRun := flag.Bool("dry-run", false, "僅模擬執行,不實際操作")

flag.Parse()

if *input == "" || *output == "" {
fmt.Println("請指定 -input 與 -output 參數")
flag.Usage()
os.Exit(1)
}

fmt.Println("Input:", *input)
fmt.Println("Output:", *output)
if *dryRun {
fmt.Println("[模擬模式] 不會實際寫入檔案")
} else {
fmt.Println("執行轉換與寫入檔案...")
}
}

🛠️ flag 套件的輔助函式

  • flag.Parse()
    解析命令列參數(需於所有定義之後呼叫)

  • flag.Args()
    取得未被解析的額外參數([]string)

  • flag.NArg()
    回傳未解析參數的個數

  • flag.Usage = func()
    自訂參數說明輸出內容(用於 -h 時顯示)


⚠️ 注意事項與補充

  • 參數名稱大小寫敏感,例如 -name-Name 是不同的。
  • 不支援像 --long-option 的雙橫線寫法,預設為單橫線開頭(符合 Unix 習慣)。
  • 可使用 flag.Var() 自訂參數型別(需實作 flag.Value 介面)。
  • 若有複雜 CLI 需求,可考慮使用第三方套件如 spf13/cobra

🎯 總結

flag 是 Go 內建的命令列參數解析工具,使用簡單、直覺且能快速上手:

  • ✅ 提供多種基本型別的參數處理
  • ✅ 支援自訂說明文字與錯誤提示
  • ✅ 適合中小型 CLI 應用開發

透過 flag 套件,我們能為應用加入靈活的啟動參數與設定控制,提升工具的使用彈性。
若未來有更複雜的命令結構需求,也可以將 flag 作為基礎,延伸到完整的 CLI 工具套件。

最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。


註:以上參考了
Go