在構建命令列工具時,良好的使用者互動體驗至關重要。尤其是在需要與使用者進行復雜輸入的場景下,傳統的命令列引數和標誌可能顯得笨拙。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: 戀水無意
騰訊雲開發者社群:孟斯特