Go Retrospective

I worked on the following small projects to familiarize myself with Go:

Here are some points that stood out:

Standalone Binaries

I’m appreciative of this feature. In comparison - distributing a similar ruby application would be extremely difficult.

Toolchain

The Go toolchain is impressive. I’ve worked professionally across many programming languages and found this one of the most enjoyable to pickup and use. The Go ecosystem appears more consistent as a result.

Error Handling

I initially found Go’s error handling painful but have come to appreciate it. It appears that improper exception handling contributes to a significant proportion of defects.

func GetOffsets() (*Offsets, error) {
	var offsets Offsets

	resp, err := http.Get(OffsetsURL)

	if err != nil {
		return nil, errors.New("Failed making offsets request")
	}

	defer resp.Body.Close()

	bytes, err := ioutil.ReadAll(resp.Body)

	if err != nil {
		return nil, errors.New("Failed reading offsets request")
	}

	err = yaml.Unmarshal(bytes, &offsets)

	if err != nil {
		return nil, errors.New("Failed parsing offsets request")
	}

	return &offsets, nil
}

Modules

I really like the way Go has implemented modular programming.

package robots

import "github.com/jamesmoriarty/gobot/directions"

type Robot struct {
	X         int64
	Y         int64
	Direction directions.Direction
}

Concurrency

Go “routines” and “channels” appear easy to use and well thought out.

shutdown := make(chan os.Signal, 1)
signal.Notify(shutdown, syscall.SIGINT, syscall.SIGTERM)

go goforward.Listen(port, rate, shutdown)

<-shutdown

Here Be Dragons

I enjoyed lower level memory work with Go but unsafe introduces bizarre new possibilities for software defects.

Windows

The APIs also appear to target the Linux and have been retrofitted to Windows.