abutil is a collection of often-used Golang helpers.
Listens to various signals and executes the given function with the received signal.
go abutil.OnSignal(func(s os.Signal) {
fmt.Printf("Got signal %s\n", s)
})
Executes the given function n times concurrently.
var m sync.Mutex
c := 0
abutil.Parallel(4, func() {
m.Lock()
defer m.Unlock()
fmt.Print(c)
c++
})
Does a rollback on the given transaction and returns either the rollback-error, if occured, or the given one.
insertSomething := func(db *sql.DB) error {
tx, _ := db.Begin()
_, err := tx.Exec("INSERT INTO some_table (some_column) VALUES (?)",
"foobar")
if err != nil {
// The old way, imagine doing this 10 times in a method
if err := tx.Rollback(); err != nil {
return err
}
return err
}
_, err = tx.Exec("DROP DATABASE foobar")
if err != nil {
// With RollbackErr
return abutil.RollbackErr(tx, err)
}
return nil
}
Tries everything to get the remote ip.
someHandler := func(w http.ResponseWriter, r *http.Request) {
fmt.Printf("New request from %s\n", abutil.RemoteIP(r))
}
A wrapper around graceful.Server
from http://github.com/tylerb/graceful
with state variable and easier handling.
s := abutil.NewGracefulServer(1337, someHandlerFunc)
// This channel blocks until all connections are closed or the time is up
sc := s.StopChan()
// Some go func that stops the server after 2 seconds for no reason
time.After(2 * time.Second, func() {
s.Stop(10 * time.Second)
})
if err := s.ListenAndServe(); err != nil && !s.Stopped() {
// We didn't stop the server, so something must be wrong
panic(err)
}
// Wait for the server to finish
<-sc
This project is licensed under the WTFPL, for more information see the LICENSE file.