Mechvibes, an open-source GUI program for simulating mechanical keyboard sound, is a program I've been using for the last 3-4 years. But since I switched to Linux, it stopped working(Wayland security issue). The program is essentially listens to keyboard inputs and plays keyboard sound on each key press. Moreover, MechVibes is built with Electron.js, so it's memory intensive(150 MB). The CLI I built only has a memory footprint of around 6 MB.
That said, I'm quite new to Go, as well as the Linux (and CLI tool) world. Since I switched from Windows to Linux, I find myself trying to accomplish a lot of things with the terminal. That also led me to try out NeoVim, which blew my mind and changed the way I look at terminals.
Do you know GoVibes is 100% developed using NeoVim??♂️
While Go is known for its simplicity like C, coming from the Javascript/Frontend world, I struggled with it. I think mainly for two reasons: firstly, I don't truly know programming(I only know framework(React) and for the last 2 years, I've been writing memorized boilerplate code.); secondly, Go is my second language and web/js development have made me inflexible at picking new languages. So learning Go was like a paradigm shift for me, which exposed a lot of my insufficiencies and skill issues. And that's clearly apparent if you check out the codebase of GoVibes.
I’m referring to this as a CLI tool, even though it doesn’t fully meet standard CLI tool criteria. It's Linux-only(tested in Fedora, and my friend's machine, who uses Arch btw!), and requires manual compilation. On top of that, the code is awful.
There's a similar CLI tool written in Rust, called Rustyvibes. I tried it and because of the Wayland security issue, it failed on my Fedora Linux. Also, I had to kill the CLI program if I wanted to change the keyboard sound flavour. Coming from the frontend world, I'm biased toward pretty UIs, and I wanted the same experience in my CLI tool. So, to precisely highlight those issues, I build GoVibes.
The core of the program is simple. There's a continuous loop that's running in a separate channel, and it listens for the incoming keyboard input event. Based on the input event, the program plays a section from the audio file. What part to play, is defined in a separate config.json file. Now there can be multiple input devices in your system. So, the program also lists all the available input devices and you can choose what channel it should listen to. What I found interesting was, as I'm new to Linux, treating devices as files like objects. And, so all I had to do to mount a device was to open it as a directory.
file, err := os.Open("/dev/input/event2")
Most of the development time went into making GoVibes interactive and look pretty. Perhaps, that effort could have been better spent on making it cross-platform and functional, but again, I'm its sole user, so it doesn't matter. Anyway, I found BubbleTea, a library for building interactive CLI(TUI) tools in Golang. The library surely had a learning curve. It took me a week to wrap my head around how all things tie together. There are also a lot of prebuilt components(Bubbles) which makes it super easy to build a pretty, user-friendly TUI.
Overall, it was a good learning experience.
- For the first time, I built something other than a CRUD.
- This time around, I actually learned some Go(file handling, go routine, channels, context, WaitGroups),
- Got a confidence boost exploring new things. Figuring out bubble tea felt foreign and overwhelming, but once it clicked, I envisioned my portrait in the Hall of Great Programmers.
The above is the detailed content of Built My First CLI Tool in Go. For more information, please follow other related articles on the PHP Chinese website!

Golang and C each have their own advantages in performance competitions: 1) Golang is suitable for high concurrency and rapid development, and 2) C provides higher performance and fine-grained control. The selection should be based on project requirements and team technology stack.

Golang is suitable for rapid development and concurrent programming, while C is more suitable for projects that require extreme performance and underlying control. 1) Golang's concurrency model simplifies concurrency programming through goroutine and channel. 2) C's template programming provides generic code and performance optimization. 3) Golang's garbage collection is convenient but may affect performance. C's memory management is complex but the control is fine.

Goimpactsdevelopmentpositivelythroughspeed,efficiency,andsimplicity.1)Speed:Gocompilesquicklyandrunsefficiently,idealforlargeprojects.2)Efficiency:Itscomprehensivestandardlibraryreducesexternaldependencies,enhancingdevelopmentefficiency.3)Simplicity:

C is more suitable for scenarios where direct control of hardware resources and high performance optimization is required, while Golang is more suitable for scenarios where rapid development and high concurrency processing are required. 1.C's advantage lies in its close to hardware characteristics and high optimization capabilities, which are suitable for high-performance needs such as game development. 2.Golang's advantage lies in its concise syntax and natural concurrency support, which is suitable for high concurrency service development.

Golang excels in practical applications and is known for its simplicity, efficiency and concurrency. 1) Concurrent programming is implemented through Goroutines and Channels, 2) Flexible code is written using interfaces and polymorphisms, 3) Simplify network programming with net/http packages, 4) Build efficient concurrent crawlers, 5) Debugging and optimizing through tools and best practices.

The core features of Go include garbage collection, static linking and concurrency support. 1. The concurrency model of Go language realizes efficient concurrent programming through goroutine and channel. 2. Interfaces and polymorphisms are implemented through interface methods, so that different types can be processed in a unified manner. 3. The basic usage demonstrates the efficiency of function definition and call. 4. In advanced usage, slices provide powerful functions of dynamic resizing. 5. Common errors such as race conditions can be detected and resolved through getest-race. 6. Performance optimization Reuse objects through sync.Pool to reduce garbage collection pressure.

Go language performs well in building efficient and scalable systems. Its advantages include: 1. High performance: compiled into machine code, fast running speed; 2. Concurrent programming: simplify multitasking through goroutines and channels; 3. Simplicity: concise syntax, reducing learning and maintenance costs; 4. Cross-platform: supports cross-platform compilation, easy deployment.

Confused about the sorting of SQL query results. In the process of learning SQL, you often encounter some confusing problems. Recently, the author is reading "MICK-SQL Basics"...


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

SublimeText3 Chinese version
Chinese version, very easy to use

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

Zend Studio 13.0.1
Powerful PHP integrated development environment

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

Atom editor mac version download
The most popular open source editor