Home Backend Development Golang How to use CLI in Go?

How to use CLI in Go?

May 11, 2023 pm 03:37 PM
go language cli (command line interface) use (implementation)

It is very common to use CLI (Command-Line Interface) in Go language because it allows us to quickly create small, command-line tools and interact with users. This article will detail how to use the CLI in Go and provide some practical tips and advice.

  1. CLI Framework

Before we start writing CLI, we need to choose a CLI framework, because these frameworks allow us to quickly create CLI and provide various functions and options . The following are some commonly used Go CLI frameworks:

  • Cobra: A very popular and powerful framework that helps us create CLI applications easily and provides various features and options.
  • Kingpin: Another popular framework that provides elegant syntax and option parsing.
  • Cli: A very simple but useful framework that helps us create small CLI applications.

We can choose the appropriate CLI framework based on the needs and complexity of the project.

  1. Creating Commands

Once we have selected the CLI framework, we can start creating commands. Commands are the main component of a CLI application, they define the application's behavior and functionality. Here are some examples of commands:

$ mycli ls
$ mycli mkdir /path/to/directory
$ mycli cat /path/to/file.txt
Copy after login

In Cobra, we can create commands using code similar to the following:

var listCmd = &cobra.Command{
    Use:   "list",
    Short: "List all the items",
    Long:  `List all the items in a given directory`,
    Run: func(cmd *cobra.Command, args []string) {
        // command logic goes here
    },
}
Copy after login

The above code creates a command called "list" , its short description is "List all items" and its long description is "List all items in the given directory".

We can use and modify this framework to easily create commonly used commands and add custom options as needed.

  1. Command Options

Command options are optional parameters in the CLI application that can be passed to the command as needed. These options can be created in two ways: using the flag package provided by the framework, or using a third-party library such as pflag or cli.

Here are some examples of command options:

$ mycli list -a -l
$ mycli cat /path/to/file --verbose=false
Copy after login

In Cobra, we can add options using something like the following code:

var listCmd = &cobra.Command{
    Use:   "list",
    Short: "List all the items",
    Long:  `List all the items in a given directory`,
    Run: func(cmd *cobra.Command, args []string) {
        // command logic goes here
    },
}

func init() {
    listCmd.PersistentFlags().BoolVarP(&showAll, "all", "a", false, "Show all files")
    listCmd.PersistentFlags().BoolVarP(&longFormat, "long", "l", false, "Use long listing format")
    rootCmd.AddCommand(listCmd)
}
Copy after login

The above code will add two flags : "all" and "long" and append them to the "list" command.

  1. Operation command line parameters

In Go, we can use the os package and flag package to operate command line parameters. The os.Args variable contains the command line arguments passed when running the application. When we use the flag package, we can easily parse and access these parameters.

The following is an example showing how to use the flag package to parse command line parameters:

func main() {
    // Define flags
    url := flag.String("url", "https://www.example.com", "URL to fetch")
    timeout := flag.Duration("timeout", time.Second * 5, "Timeout for HTTP request")

    flag.Parse()

    // Use flags
    fmt.Printf("Fetching %s with timeout %v...", *url, *timeout)
}
Copy after login

The above code creates two flags: "url" and "timeout", and then parses and uses them.

  1. Command Interaction

By interacting with the user, we can create more complex and useful CLI applications. Go has many libraries that can help us achieve interaction, such as cli, term and other libraries.

The following is an example using the cli library:

func main() {
    app := cli.NewApp()
    app.Name = "myapp"
    app.Usage = "An example CLI application"

    // Define commands
    app.Commands = []cli.Command{
        {
            Name:    "greet",
            Aliases: []string{"g"},
            Usage:   "Greet the user",
            Action: func(c *cli.Context) error {
                fmt.Println("Hello!")
                return nil
            },
        },
        // Add more commands here
    }

    app.Run(os.Args)
}
Copy after login

The above code defines a command named "greet", which will output "Hello!" and exit the program. We can add more custom commands and interactions as needed.

  1. Testing the CLI Application

Finally, we need to test the CLI application to make sure it works as expected. We can use the testing package in the Go standard library and some third-party tools for testing, such as Testify, GoConvey, etc.

The following is sample test code:

func TestListCmd(t *testing.T) {
    cmd := exec.Command("mycli", "list", "-a", "-l")
    bytes, err := cmd.CombinedOutput()
    output := string(bytes)
    if err != nil {
        t.Errorf("Command failed: %v", err)
    }
    if !strings.Contains(output, "testFile") {
        t.Errorf("Expected output to contain 'testFile', got '%s'", output)
    }
}
Copy after login

The above code tests the command named "list" to ensure that it can display the file list correctly.

Summary

In this article, we covered how to create a CLI application in Go. We learned about the process of selecting a CLI framework, creating commands, using command options, manipulating command line arguments, and interacting with and testing CLI applications. Hope this information is helpful to you and you can implement more useful functions and functions for your CLI application.

The above is the detailed content of How to use CLI in Go?. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What libraries are used for floating point number operations in Go? What libraries are used for floating point number operations in Go? Apr 02, 2025 pm 02:06 PM

The library used for floating-point number operation in Go language introduces how to ensure the accuracy is...

What is the problem with Queue thread in Go's crawler Colly? What is the problem with Queue thread in Go's crawler Colly? Apr 02, 2025 pm 02:09 PM

Queue threading problem in Go crawler Colly explores the problem of using the Colly crawler library in Go language, developers often encounter problems with threads and request queues. �...

In Go, why does printing strings with Println and string() functions have different effects? In Go, why does printing strings with Println and string() functions have different effects? Apr 02, 2025 pm 02:03 PM

The difference between string printing in Go language: The difference in the effect of using Println and string() functions is in Go...

How to solve the user_id type conversion problem when using Redis Stream to implement message queues in Go language? How to solve the user_id type conversion problem when using Redis Stream to implement message queues in Go language? Apr 02, 2025 pm 04:54 PM

The problem of using RedisStream to implement message queues in Go language is using Go language and Redis...

What is the difference between `var` and `type` keyword definition structure in Go language? What is the difference between `var` and `type` keyword definition structure in Go language? Apr 02, 2025 pm 12:57 PM

Two ways to define structures in Go language: the difference between var and type keywords. When defining structures, Go language often sees two different ways of writing: First...

Which libraries in Go are developed by large companies or provided by well-known open source projects? Which libraries in Go are developed by large companies or provided by well-known open source projects? Apr 02, 2025 pm 04:12 PM

Which libraries in Go are developed by large companies or well-known open source projects? When programming in Go, developers often encounter some common needs, ...

What should I do if the custom structure labels in GoLand are not displayed? What should I do if the custom structure labels in GoLand are not displayed? Apr 02, 2025 pm 05:09 PM

What should I do if the custom structure labels in GoLand are not displayed? When using GoLand for Go language development, many developers will encounter custom structure tags...

When using sql.Open, why does not report an error when DSN passes empty? When using sql.Open, why does not report an error when DSN passes empty? Apr 02, 2025 pm 12:54 PM

When using sql.Open, why doesn’t the DSN report an error? In Go language, sql.Open...

See all articles