Promptui教學:快速建立 Go 語言的交互式介面

更新於 2024/09/27閱讀時間約 24 分鐘


raw-image

👨‍💻簡介

今天來介紹一個自己開發後端蠻常用的一個 package,promptui,拿來做menu真的很方便,promptui有兩個主要的輸入模式:

  1. Prompt:跳出單行使用者輸入。
  2. Select:提供一個選項列表供使用者選擇。

Prompt

prompt是一個struct,當執行Run時會返回輸入的結果

type Prompt struct {
// Label is the value displayed on the command line prompt.
//
// The value for Label can be a simple string or a struct that will need to be accessed by dot notation
// inside the templates. For example, `{{ .Name }}` will display the name property of a struct.
Label interface{}

// Default is the initial value for the prompt. This value will be displayed next to the prompt's label
// and the user will be able to view or change it depending on the options.
Default string

// AllowEdit lets the user edit the default value. If false, any key press
// other than <Enter> automatically clears the default value.
AllowEdit bool

// Validate is an optional function that fill be used against the entered value in the prompt to validate it.
Validate ValidateFunc

// Mask is an optional rune that sets which character to display instead of the entered characters. This
// allows hiding private information like passwords.
Mask rune

// HideEntered sets whether to hide the text after the user has pressed enter.
HideEntered bool

// Templates can be used to customize the prompt output. If nil is passed, the
// default templates are used. See the PromptTemplates docs for more info.
Templates *PromptTemplates

// IsConfirm makes the prompt ask for a yes or no ([Y/N]) question rather than request an input. When set,
// most properties related to input will be ignored.
IsConfirm bool

// IsVimMode enables vi-like movements (hjkl) and editing.
IsVimMode bool

// the Pointer defines how to render the cursor.
Pointer Pointer

Stdin io.ReadCloser
Stdout io.WriteCloser
}

語法如下:

func (*promptui.Prompt).Run() (string, error)
package main

import (
"fmt"
"github.com/manifoldco/promptui"
)
func main() {

prompt := promptui.Prompt{
Label: "Anything",
}
result, err := prompt.Run()
if err != nil {
fmt.Printf("Prompt failed %v\n", err)
return
}

fmt.Printf("You typed %q\n", result)
}

確認(Confirm)

建立一個確認提示,使用者可以選擇是或否。

package main

import (
"fmt"
"github.com/manifoldco/promptui"
)

func main() {
prompt := promptui.Prompt{
Label: "Delete all resources",
IsConfirm: true,
}

_, err := prompt.Run()

if err != nil {
fmt.Printf("Prompt failed %v\n", err)
return
}

fmt.Printf("Resources deleted")
}

自定義提示(Custom Prompt)

這個功能是讓使用者可以自己定義提示的外觀和行為。例如,你可以更改提示的顏色,標籤和其他設定。

package main

import (
"fmt"
"errors"
"github.com/manifoldco/promptui"
)

func main() {
prompt := promptui.Prompt{
Label: "Enter your name",
Validate: func(input string) error {
if len(input) < 3 {
return errors.New("Name must have more than 3 characters")
}
return nil
},
}

result, err := prompt.Run()

if err != nil {
fmt.Printf("Prompt failed %v\n", err)
return
}

fmt.Printf("Hello %q\n", result)
}

提示預設值(Prompt Default)

Promptui 支援設定提示的預設值。

package main

import (
"fmt"
"github.com/manifoldco/promptui"
)

func main() {
prompt := promptui.Prompt{
Label: "Enter your name",
Default: "Alan",
}

result, err := prompt.Run()

if err != nil {
fmt.Printf("Prompt failed %v\n", err)
return
}

fmt.Printf("Hello %q\n", result)
}

密碼提示(Password Prompt)

Promptui 可以用來建立一個密碼提示,其中使用者輸入的文本將被掩蓋。

package main

import (
"fmt"
"github.com/manifoldco/promptui"
)

func main() {
prompt := promptui.Prompt{
Label: "Enter Password",
Mask: '*',
}

result, err := prompt.Run()

if err != nil {
fmt.Printf("Prompt failed %v\n", err)
return
}

fmt.Printf("Password entered: %q\n", result)
}

Select

Select也是一個struct,與Prompt不同的是當執行Run時會返回index以及選中的結果

type Select struct {
// Label is the text displayed on top of the list to direct input. The IconInitial value "?" will be
// appended automatically to the label so it does not need to be added.
//
// The value for Label can be a simple string or a struct that will need to be accessed by dot notation
// inside the templates. For example, `{{ .Name }}` will display the name property of a struct.
Label interface{}

// Items are the items to display inside the list. It expect a slice of any kind of values, including strings.
//
// If using a slice of strings, promptui will use those strings directly into its base templates or the
// provided templates. If using any other type in the slice, it will attempt to transform it into a string
// before giving it to its templates. Custom templates will override this behavior if using the dot notation
// inside the templates.
//
// For example, `{{ .Name }}` will display the name property of a struct.
Items interface{}

// Size is the number of items that should appear on the select before scrolling is necessary. Defaults to 5.
Size int

// CursorPos is the initial position of the cursor.
CursorPos int

// IsVimMode sets whether to use vim mode when using readline in the command prompt. Look at
// https://godoc.org/github.com/chzyer/readline#Config for more information on readline.
IsVimMode bool

// HideHelp sets whether to hide help information.
HideHelp bool

// HideSelected sets whether to hide the text displayed after an item is successfully selected.
HideSelected bool

// Templates can be used to customize the select output. If nil is passed, the
// default templates are used. See the SelectTemplates docs for more info.
Templates *SelectTemplates

// Keys is the set of keys used in select mode to control the command line interface. See the SelectKeys docs for
// more info.
Keys *SelectKeys

// Searcher is a function that can be implemented to refine the base searching algorithm in selects.
//
// Search is a function that will receive the searched term and the item's index and should return a boolean
// for whether or not the terms are alike. It is unimplemented by default and search will not work unless
// it is implemented.
Searcher list.Searcher

// StartInSearchMode sets whether or not the select mode should start in search mode or selection mode.
// For search mode to work, the Search property must be implemented.
StartInSearchMode bool

list *list.List

// A function that determines how to render the cursor
Pointer Pointer

Stdin io.ReadCloser
Stdout io.WriteCloser
}

語法如下:

func (*promptui.Select).Run() (int, string, error)
func (*promptui.Select).RunCursorAt(cursorPos int, scroll int) (int, string, error)
func (*promptui.Select).ScrollPosition() int
package main

import (
"fmt"
"github.com/manifoldco/promptui"
)

func main() {
prompt := promptui.Select{
Label: "Select Day",
Items: []string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
"Saturday", "Sunday"},
}
_, result, err := prompt.Run()
if err != nil {
fmt.Printf("Prompt failed %v\n", err)
return
}
fmt.Printf("You choose %q\n", result)
}

自定義選擇(Custom Select)

除了基本的選擇提示外,Promptui 還允許使用者自定義選擇列表的外觀和行為。

package main

import (
"fmt"
"github.com/manifoldco/promptui"
)

func main() {
prompt := promptui.Select{
Label: "Choose Color",
Items: []string{"Red", "Blue", "Green"},
Templates: &promptui.SelectTemplates{
Label: "{{ . }}?",
Active: "\U0001F336 {{ . | red }}",
Inactive: " {{ . | cyan }}",
Selected: "\U0001F336 {{ . | red | cyan }}",
},
}

_, result, err := prompt.Run()

if err != nil {
fmt.Printf("Prompt failed %v\n", err)
return
}

fmt.Printf("You choose %q\n", result)
}

選擇添加(Select Add)

Promptui 還允許使用者在選擇提示中添加新的選項。

package main

import (
"fmt"
"github.com/manifoldco/promptui"
)

func main() {
items := []string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"}
prompt := promptui.SelectWithAdd{
Label: "What day is it?",
Items: items,
AddLabel: "Other",
}
idx, result, err := prompt.Run()

if err != nil {
fmt.Printf("Prompt failed %v\n", err)
return
}
if idx == len(items) {
fmt.Printf("You chose to add %q\n", result)
} else {
fmt.Printf("You chose %q\n", result)
}
}

📚Reference

avatar-img
17會員
83內容數
golang
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Alan的開發者天地 的其他內容
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
👨‍💻 簡介 一開始介紹基本資料型別時有稍微提到一點string的處理,今天介紹string的一些操作,像是檢查的功能、修改的功能、比較的功能等等。
👨‍💻 簡介 昨天講到 os package,今天繼續補充 os package底下的 exec package,這個package主要用來執行外部指令和處理指令的輸入和輸出,包括如何設定指令、執行指令以及處理輸出等等。
👨‍💻 簡介 今天快速介紹一下對檔案的操作所使用的package os,包括檔案和資料夾操作等。 檔案和資料夾操作 os package 可以執行各種檔案和資料夾操作,如建立、讀取、寫入、刪除檔案,以及取得資料夾內容等。
👨‍💻簡介 在 Go 語言中,reflect package是用來檢查和操作變數的type、value和struct。常見用法有檢察 type、調用方法,以及修改變數的value。今天簡單介紹 reflect package的主要功能、使用方法和常見用法。
👨‍💻 簡介 今天的encoding/json package是我日常在開發web時很常用到的package之一,主要是用來將Go struct和 JSON 之間進行轉換。主要功能為資料序列化(marshalling)和反序列化(unmarshalling)。
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
👨‍💻 簡介 一開始介紹基本資料型別時有稍微提到一點string的處理,今天介紹string的一些操作,像是檢查的功能、修改的功能、比較的功能等等。
👨‍💻 簡介 昨天講到 os package,今天繼續補充 os package底下的 exec package,這個package主要用來執行外部指令和處理指令的輸入和輸出,包括如何設定指令、執行指令以及處理輸出等等。
👨‍💻 簡介 今天快速介紹一下對檔案的操作所使用的package os,包括檔案和資料夾操作等。 檔案和資料夾操作 os package 可以執行各種檔案和資料夾操作,如建立、讀取、寫入、刪除檔案,以及取得資料夾內容等。
👨‍💻簡介 在 Go 語言中,reflect package是用來檢查和操作變數的type、value和struct。常見用法有檢察 type、調用方法,以及修改變數的value。今天簡單介紹 reflect package的主要功能、使用方法和常見用法。
👨‍💻 簡介 今天的encoding/json package是我日常在開發web時很常用到的package之一,主要是用來將Go struct和 JSON 之間進行轉換。主要功能為資料序列化(marshalling)和反序列化(unmarshalling)。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
我們人類和ChatGPT的對話技巧也是需要學習的,有鑑於此,我想要一天分享一點「和ChatGPT對話的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 基於 "Rethinking the Role of Demonstrations: What Make
我們人類和ChatGPT的對話技巧也是需要學習的,有鑑於此,我想要一天分享一點「和ChatGPT對話的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 正如各種範例所示,N-Shot Prompting 展示了其在引導 AI 模型實現所需輸出方面的熟練程度
Thumbnail
我們人類和ChatGPT的對話技巧也是需要學習的,有鑑於此,我想要一天分享一點「和ChatGPT對話的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 如果正確利用 N-Shot Prompting,有可能顯著提高大型語言模型在複雜任務上的表現,然而,與任
我們人類和ChatGPT的對話技巧也是需要學習的,有鑑於此,我想要一天分享一點「和ChatGPT對話的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 今天來舉一些例子: 金融市場分析:市場趨勢的標籤 5-Shot Prompt: 本季公佈的公司
Thumbnail
👨‍💻簡介 今天來介紹一個自己開發後端蠻常用的一個 package,promptui,拿來做menu真的很方便,promptui有兩個主要的輸入模式: Prompt:跳出單行使用者輸入。 Select:提供一個選項列表供使用者選擇。
Thumbnail
ChatGPT怎麼用? 在 ChatGPT官網 註冊好帳號後,進入 ChatGPT app 打開對話框輸入一些指令以後卻問不出你想要的? 這篇 ChatGPT中文 進階提示詞技巧教學是超簡單框架輕鬆創建提示詞的進階版,Mega Prompting 是另一種從 ChatGPT 中提取價值的技術,它涉及
Thumbnail
選擇權籌碼分析,最最最重要的事情:必須從交易動機進行推測。|市場大多數是自動化交易,選擇權籌碼是經過一系列計算產出的結論,從這邊回推各方勢力意圖、讀出短期走勢其實不難。分析選擇權籌碼,讀懂市場動向,3步驟學會分析選擇權籌碼與籌碼背後的意義。
Thumbnail
用一段又一段的重要事件串起生命裡的資源與禮物,並且像是一本故事書一樣為它做故事簡介、封面設計及命名,都在過程中看到每個人的渴望或獨特之處,即便一個人看似對一切感到失望,但是,我們的身體和情緒不會騙人的,那些靈魂為之震動之處,都會用它的話語訴說,只是,我們聽見了沒有?
Thumbnail
提到「價值觀」,你先想到的是什麼?又會怎麼解釋它?你曾想過「價值觀」的探索為何如此重要嗎?在網路上找了幾篇有關價值觀的論述後,我整理了如上的內容,同時也想推薦一篇文章⋯⋯
Thumbnail
我們都太想要成為別人了!以致於那麼難以接受自己本來如是的樣子:從對於自己身材與外貌的挑剔、能力的挑剔、個性的挑剔⋯⋯,都不斷地向自己釋放出『我不喜歡自己』的訊息,我指的是能量上的部分,當然,我們還是⋯⋯
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
我們人類和ChatGPT的對話技巧也是需要學習的,有鑑於此,我想要一天分享一點「和ChatGPT對話的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 基於 "Rethinking the Role of Demonstrations: What Make
我們人類和ChatGPT的對話技巧也是需要學習的,有鑑於此,我想要一天分享一點「和ChatGPT對話的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 正如各種範例所示,N-Shot Prompting 展示了其在引導 AI 模型實現所需輸出方面的熟練程度
Thumbnail
我們人類和ChatGPT的對話技巧也是需要學習的,有鑑於此,我想要一天分享一點「和ChatGPT對話的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 如果正確利用 N-Shot Prompting,有可能顯著提高大型語言模型在複雜任務上的表現,然而,與任
我們人類和ChatGPT的對話技巧也是需要學習的,有鑑於此,我想要一天分享一點「和ChatGPT對話的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 今天來舉一些例子: 金融市場分析:市場趨勢的標籤 5-Shot Prompt: 本季公佈的公司
Thumbnail
👨‍💻簡介 今天來介紹一個自己開發後端蠻常用的一個 package,promptui,拿來做menu真的很方便,promptui有兩個主要的輸入模式: Prompt:跳出單行使用者輸入。 Select:提供一個選項列表供使用者選擇。
Thumbnail
ChatGPT怎麼用? 在 ChatGPT官網 註冊好帳號後,進入 ChatGPT app 打開對話框輸入一些指令以後卻問不出你想要的? 這篇 ChatGPT中文 進階提示詞技巧教學是超簡單框架輕鬆創建提示詞的進階版,Mega Prompting 是另一種從 ChatGPT 中提取價值的技術,它涉及
Thumbnail
選擇權籌碼分析,最最最重要的事情:必須從交易動機進行推測。|市場大多數是自動化交易,選擇權籌碼是經過一系列計算產出的結論,從這邊回推各方勢力意圖、讀出短期走勢其實不難。分析選擇權籌碼,讀懂市場動向,3步驟學會分析選擇權籌碼與籌碼背後的意義。
Thumbnail
用一段又一段的重要事件串起生命裡的資源與禮物,並且像是一本故事書一樣為它做故事簡介、封面設計及命名,都在過程中看到每個人的渴望或獨特之處,即便一個人看似對一切感到失望,但是,我們的身體和情緒不會騙人的,那些靈魂為之震動之處,都會用它的話語訴說,只是,我們聽見了沒有?
Thumbnail
提到「價值觀」,你先想到的是什麼?又會怎麼解釋它?你曾想過「價值觀」的探索為何如此重要嗎?在網路上找了幾篇有關價值觀的論述後,我整理了如上的內容,同時也想推薦一篇文章⋯⋯
Thumbnail
我們都太想要成為別人了!以致於那麼難以接受自己本來如是的樣子:從對於自己身材與外貌的挑剔、能力的挑剔、個性的挑剔⋯⋯,都不斷地向自己釋放出『我不喜歡自己』的訊息,我指的是能量上的部分,當然,我們還是⋯⋯