Ở một post trước mình đã hướng dẫn các bạn bạn build cli hoặc giống như là kubeclt:
Ở lần này chúng ta sẽ nâng cấp hơn lên tầm cao mới.
Build 1 terminal UI bằng golang.
https://github.com/charmbracelet/huh
Nó là thư viện đơn giản và mạnh mẽ cho việc xây dựng form và prompts tương tác trong terminal.
Bạn có thể nhìn ảnh bên dưới để dễ tưởng tượng:
![](https://nimtechnology.com/wp-content/uploads/2025/01/68747470733a2f2f7668732e636861726d2e73682f7668732d334a34693648453379426d7a3653554f334871494c722e676966.gif)
Bên dưới này là 1 ví dụ:
package main import ( "log" "strconv" "strings" "github.com/charmbracelet/huh" ) func main() { var name string var ageStr string // Temporary string variable for input var age int // Final integer variable var gender string // Variable to store gender // Create initial form for name and age form := huh.NewForm( huh.NewGroup( huh.NewInput(). Title("What is your name?"). Value(&name), huh.NewInput(). Title("What is your age?"). Value(&ageStr), // Store the age as a string ), ) // Run the form if err := form.Run(); err != nil { log.Fatal(err) } // Convert age from string to int age, err := strconv.Atoi(ageStr) if err != nil { log.Fatalf("Invalid age input: %s", err) } // Check age and ask for gender if age > 7 if age > 7 { for { genderForm := huh.NewForm( huh.NewGroup( huh.NewInput(). Title("Are you male or female? (Type 'male' or 'female')"). Value(&gender), ), ) // Run the gender form if err := genderForm.Run(); err != nil { log.Fatal(err) } // Normalize input (case insensitive) gender = strings.ToLower(strings.TrimSpace(gender)) // Validate input if gender == "male" || gender == "female" { break // Valid input, exit the loop } else { log.Println("Invalid input. Please enter 'male' or 'female'.") } } log.Printf("Name: %s, Age: %d, Gender: %s", name, age, gender) } else { log.Printf("Name: %s, Age: %d", name, age) } }
Lúc này bạn có thể build ra run thử kết quả:
![](https://nimtechnology.com/wp-content/uploads/2025/01/image-1.png?v=1736243195)
Mình thực hiện nhập nếu age > 8 nó hiện lên 1 form khác,
![](https://nimtechnology.com/wp-content/uploads/2025/01/image-2.png?v=1736243258)
![](https://nimtechnology.com/wp-content/uploads/2025/01/image-3.png?v=1736243348)