up

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
 */