Skip to content

Instantly share code, notes, and snippets.

View nwillc's full-sized avatar

Nwillc nwillc

View GitHub Profile
@nwillc
nwillc / panic_recover.go
Last active July 14, 2022 14:58
Go showing basic panic recover
func CaculateSomething(i int) (result int, err error) {
// Does a bunch of math to calculate a value, or
// returns an error when it can't.
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("panic: %+v", r)
}
}()
// ... the magic ...
return result, err
@nwillc
nwillc / calc_something.go
Created July 14, 2022 14:54
Example Go that might panic
func CaculateSomething(i int) (result int, err error) {
// Does a bunch of math to calculate a value, or
// returns an error when it can't.
// ... the magic ...
return result, err
}
@nwillc
nwillc / error_handling.go
Created July 14, 2022 14:53
Standard Go error handling pattern
result, err := someFunction() // Returns a result or an error
if err != nil {
// handle error
}
@nwillc
nwillc / query_example1.go
Created July 14, 2022 14:31
Example using generics based go query
{
// A simple student
type Student struct {
id int
grade int
name string
}
// Bind elements to result columns
binder := func(s *Student) []any {
return []any{&s.id, &s.name, &s.grade}
@nwillc
nwillc / query.go
Created July 14, 2022 14:30
Go generics enhanced database query
func Query[T any](
db *sql.DB,
binder func(*T) []any,
query string,
args ...any) (error, []*T) {
rows, err := db.Query(query, args...)
if err != nil {
return err, nil
}
defer func() {
func colors(colorNames map[string]tcell.Color) string {
var names []string
for name := range colorNames {
names = append(names, name)
}
sort.Strings(names)
return strings.Join(names, ", ")
}
func fonts(names []string) string {
func readBitmaps(embedFs embed.FS, path string) Font {
files, err := embedFs.ReadDir(path)
if err != nil {
panic(err)
}
toFontRuneKV := func(f fs.DirEntry) (rune, FontRune) {
return toCharName(f.Name()), toFontRune(embedFs, path, f.Name())
}
return genfuncs.Associate(files, toFontRuneKV)
}
func readBitmaps(fs embed.FS, path string) (Font, error) {
runes := make(map[rune]FontRune)
files, err := fs.ReadDir(path)
if err != nil {
return nil, err
}
for _, file := range files {
r, err := toFontRune(fs, path, file.Name())
if err != nil {
return nil, err
hasData genfuncs.Predicate[string] = func(l string) bool { return len(l) > 2 }
toRuneSlice genfuncs.Function[string, []rune] = func(s string) []rune { return []rune(s) }
toPixel genfuncs.Function[rune, bool] = func(r rune) bool { return r == blackPixel }
toPixelSlice genfuncs.Function[[]rune, []bool] = func(rs []rune) []bool { return genfuncs.Map(rs, toPixel) }