Go Concepts
Golang concepts and snippets for recap and copying.
Contents
File Watcher
Receive file and directory events via channel. Referenced in this post.
watcher, _ := fsnotify.NewWatcher()
_ = watcher.Add("/tmp")
for {
select {
case event, _ := <-watcher.Events:
fmt.Println("event:", event)
case err, _ := <-watcher.Errors:
fmt.Println("error:", err)
}
}
Example:
package main
import (
"fmt"
"time"
"github.com/fsnotify/fsnotify"
)
func main() {
// Create new watcher.
watcher, err := fsnotify.NewWatcher()
if err != nil {
fmt.Printf("error creating fsnotify watcher: %s\n", err)
return
}
defer watcher.Close()
// Add a path.
if err := watcher.Add("/tmp"); err != nil {
fmt.Printf("error adding püath to watcher: %s\n", err)
return
}
for {
select {
case event, ok := <-watcher.Events:
if !ok {
return
}
fmt.Printf("%s %s\n", time.Now().Format("15:04:05.99"), event)
case err, ok := <-watcher.Errors:
if !ok {
return
}
fmt.Printf("%s %s\n", time.Now().Format("15:04:05.99"), err)
}
}
}
Hash Sets
Data-structure to keep values unique. Equivalent to a mathematical ‘set’. Referenced in this post.
var hashSet map[string]struct{}
Signal Handler
Receive signals from the kernel via channel.
signalHandler := make(chan os.Signal, 1)
signal.Notify(signalHandler, syscall.SIGINT, syscall.SIGTERM)
<-signalHandler
Example:
func main() {
signalHandler := make(chan os.Signal, 1)
signal.Notify(signalHandler, syscall.SIGINT, syscall.SIGTERM)
fmt.Println("press ctrl+c for exit...")
<-signalHandler
fmt.Println("bye")
}
/*
*$ go run main.go
* press ctrl+c for exit...
* ^Cbye
*/