Introduction
As I work on various Go projects, I often find myself creating utility functions, extending existing packages, or developing packages to solve specific problems. Moving from one project to another, I usually have to copy or rewrite these solutions. So I created this repository to have all these utilities and packages in one place. Hopefully, you'll find them useful as well.
These packages aim to enhance the functionality of the standard library and other popular packages. They are intended to be used together with other packages rather than replacing them. The APIs are designed based on my experience working with Go, focusing on simplicity and ease of use. I will try to follow best practices in Go, but not always. I also tend to choose a more performance implementation if possible.
ezpkg.io/fmtz
Package fmtz extends the standard library fmt with additional functions.
Examples
fmt.State
The stdlib fmt.State
provides many functions that always return nil error. They have their counterparts as fmtz.State
that eliminate the need of error handling. There is also fmtz.MustState
that panics on error, which is useful when other types implement fmt.State
that may return non-nil error.
type Code struct {
Char rune
Number int
}
func (c Code) Format(s0 fmt.State, r rune) {
s := fmtz.WrapState(s0)
s.WriteRuneZ(c.Char)
s.Print(c.Number)
}
func main() {
c := Code{'Ω', 123}
fmt.Printf("%v", c)
}
FormatMsgArgs
fmtz.FormatMsgArgs
is a helper function that formats a message with arguments. It is useful for using in logging and error messages.
func validate(err error, msgAndArgs ...any) error {
if err == nil {
return nil
}
msg := fmtz.FormatMsgArgs(msgAndArgs...)
return typez.If(msg == "", err, fmt.Errorf("%v: %w", msg, err))
}
func main() {
someError := errors.New("something went wrong")
err := validate(someError, "failed to do something foo=%v bar=%v", "10", "20")
fmt.Println(err)
// Output: failed to do something foo=10 bar=20: something went wrong
}