Go語言中的互動式CLI開發:survey庫簡介

落雷發表於2024-09-03

在構建命令列工具時,良好的使用者互動體驗至關重要。尤其是在需要與使用者進行復雜輸入的場景下,傳統的命令列引數和標誌可能顯得笨拙。github.com/AlecAivazis/survey/v2 是一個為 Go 語言設計的庫,專門用於構建互動式的命令列介面。它提供了多種使用者輸入方式,讓你的 CLI 工具變得更加易用和友好。

一、survey 是什麼?

survey 是一個 Go 庫,旨在透過互動式提示收集使用者輸入。它提供了一組豐富的提示型別,包括文字輸入、選擇選單、確認提示、多項選擇等,極大地方便了開發者在命令列工具中實現使用者互動。

主要功能:

  • 簡單易用:幾行程式碼即可實現複雜的使用者互動邏輯。
  • 多種提示型別:支援文字輸入、選擇、確認、多選、密碼輸入等。
  • 驗證機制:提供輸入驗證功能,確保使用者輸入的有效性。
  • 預設值與自定義:支援預設值和高度自定義的提示行為。

二、安裝 survey

要在專案中使用 survey,首先需要安裝它:

go get -u github.com/AlecAivazis/survey/v2

安裝完成後,你可以在專案中匯入它:

import "github.com/AlecAivazis/survey/v2"

三、使用示例

1. 簡單文字輸入

最基礎的使用場景是從使用者處收集文字輸入。比如,我們想詢問使用者的名字:

package main

import (
    "fmt"
    "github.com/AlecAivazis/survey/v2"
)

func main() {
    var name string
    prompt := &survey.Input{
        Message: "What is your name?",
    }
    survey.AskOne(prompt, &name)

    fmt.Printf("Hello, %s!\n", name)
}

在這個例子中,survey.Input 建立了一個文字輸入提示,使用者的輸入將儲存在 name 變數中。

2. 選擇選單

有時候我們需要使用者從一組選項中選擇一個。這時可以使用 survey.Select

var color string
prompt := &survey.Select{
    Message: "Choose a color:",
    Options: []string{"Red", "Blue", "Green", "Yellow"},
}
survey.AskOne(prompt, &color)

fmt.Printf("You chose %s!\n", color)

survey.Select 會展示一個選單,使用者可以使用上下箭頭鍵進行選擇。

3. 確認提示

在需要使用者確認操作時,可以使用 survey.Confirm

var confirm bool
prompt := &survey.Confirm{
    Message: "Do you want to proceed?",
}
survey.AskOne(prompt, &confirm)

if confirm {
    fmt.Println("Proceeding...")
} else {
    fmt.Println("Operation canceled.")
}

survey.Confirm 提供了一個簡單的 yes/no 提示,適用於操作確認。

4. 多項選擇

如果需要使用者選擇多個選項,可以使用 survey.MultiSelect

var languages []string
prompt := &survey.MultiSelect{
    Message: "What programming languages do you know?",
    Options: []string{"Go", "Python", "JavaScript", "Rust"},
}
survey.AskOne(prompt, &languages)

fmt.Printf("You selected: %v\n", languages)

在這個例子中,使用者可以選擇多個程式語言,結果將以切片形式儲存。

5. 密碼輸入

對於敏感資訊,如密碼輸入,可以使用 survey.Password,使用者的輸入不會顯示在螢幕上:

var password string
prompt := &survey.Password{
    Message: "Enter your password:",
}
survey.AskOne(prompt, &password)

fmt.Println("Password received.")

survey.Password 是處理使用者輸入敏感資訊的理想選擇。

四、輸入驗證

survey 還支援對使用者輸入進行驗證,以確保輸入符合預期。例如,要求使用者輸入一個有效的電子郵件地址:

package main

import (
    "fmt"
    "github.com/AlecAivazis/survey/v2"
    "strings"
)

func main() {
    var email string
    prompt := &survey.Input{
        Message: "Enter your email:",
    }
    survey.AskOne(prompt, &email, survey.WithValidator(survey.Required), survey.WithValidator(func(val interface{}) error {
        if str, ok := val.(string); ok {
            if !strings.Contains(str, "@") {
                return fmt.Errorf("invalid email address")
            }
        }
        return nil
    }))

    fmt.Printf("Email entered: %s\n", email)
}

在這裡,我們使用了 survey.WithValidator 新增自定義驗證函式,確保使用者輸入的內容是有效的電子郵件地址。

五、結合 Cobra 使用

survey 常常與 Cobra 結合使用,以建立更復雜的命令列應用程式。例如,你可以在 Cobra 命令的 Run 方法中呼叫 survey 提示,從而實現互動式的命令引數輸入。

package main

import (
    "fmt"
    "github.com/spf13/cobra"
    "github.com/AlecAivazis/survey/v2"
)

var rootCmd = &cobra.Command{
    Use:   "myapp",
    Short: "MyApp is an interactive CLI application",
    Run: func(cmd *cobra.Command, args []string) {
        var name string
        var age int

        namePrompt := &survey.Input{
            Message: "What is your name?",
        }
        agePrompt := &survey.Input{
            Message: "How old are you?",
        }

        survey.AskOne(namePrompt, &name)
        survey.AskOne(agePrompt, &age)

        fmt.Printf("Hello, %s! You are %d years old.\n", name, age)
    },
}

func main() {
    rootCmd.Execute()
}

這個例子展示瞭如何在 Cobra 命令中嵌入 survey,為使用者提供互動式體驗。


孟斯特

宣告:本作品採用署名-非商業性使用-相同方式共享 4.0 國際 (CC BY-NC-SA 4.0)進行許可,使用時請註明出處。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 戀水無意
騰訊雲開發者社群:孟斯特


相關文章