Jordan Savant # Software Engineer

Go Example Code

Go is an awesome language.

Threads

package main
import (
    "fmt"
    "time"
)

func main() {
    go runThread(2, "a")
    go runThread(1, "b")
    time.Sleep(3 * time.Second)
}

func runThread(seconds int, name string) {
    time.Sleep(time.Duration(seconds) * time.Second)
    fmt.Println("thread", name)
}

Waitgroup

package main
import (
    "fmt"
    "time"
    "sync"
)

func main() {
    var wg sync.WaitGroup;
    go runThread(2, "a", &wg)
    wg.Add(1)
    go runThread(1, "b", &wg)
    wg.Add(1)
    wg.Wait()
    fmt.Println("done")
}

func runThread(seconds int, name string, wg *sync.WaitGroup) {
    time.Sleep(time.Duration(seconds) * time.Second)
    fmt.Println("thread", name)
    wg.Done()
}

Mutex

package main
import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup;
    var mx sync.Mutex;

    go runThread("a", &mx, &wg)
    wg.Add(1)
    go runThread("b", &mx, &wg)
    wg.Add(1)

    wg.Wait()
}

func runThread(name string, mx *sync.Mutex, wg *sync.WaitGroup) {
    mx.Lock()

    fmt.Println("in critical section", name)
    time.Sleep(2 * time.Second)

    mx.Unlock()

    wg.Done()
}

Channels

package main
import (
    "fmt"
    "time"
)

func main() {
    // channel will buffer up to 2 strings
    ch := make(chan string, 2)

    go runThread("a", 3, ch)
    go runThread("b", 2, ch)

    msg1 := <-ch
    fmt.Println(msg1)
    msg2 := <-ch
    fmt.Println(msg2)
}

func runThread(name string, sleep int, ch chan string) {
    time.Sleep(time.Duration(sleep) * time.Second)
    ch <- "message from thread " + name
}

Atomic

package main

import (
    "fmt"
    "sync"
    "sync/atomic"
)

func main() {
    var ops uint64 // will be edited across threads
    var wg sync.WaitGroup

    for i := 0; i < 50; i++ { // create 50 threads
        wg.Add(1)

        // fire a goroutine w/ functional programming too
        go func() {
            for c := 0; c < 1000; c++ {
                atomic.AddUint64(&ops, 1) // atomic operation
            }
            wg.Done()
        }()
    }

    wg.Wait()
    fmt.Println("ops:", ops)
}