Actions

Golang

From Ever changing code

Ubuntu Install

Ubuntu 18.04 inc. WSL
sudo apt install golang-go
Ubuntu LTS 16.04, also WSL Ubuntu 16.04

These steps allow to install more modern version of Golang than comes from official Ubuntu repositories. There was major changes between in 1.7 but default version seems to be 1.6.2. At the time of writing this I installed version go1.12.9.

Download from https://golang.org/dl/ and extract it into /usr/local, creating a Go tree in /usr/local/go

sudo tar -C /usr/local -xzvf go$VERSION.$OS-$ARCH.tar.gz


Add /usr/local/go/bin to the PATH environment variable. You can do this by adding this line to your /etc/profile (for a system-wide installation) or $HOME/.profile:

sudo update-alternatives --install "/usr/bin/go" "go" "/usr/local/go/bin/go" 2 #adds to the $PATH
export PATH=$PATH:/usr/local/go/bin #optional

# Set $GOPATH
export GOPATH=$HOME/go 
export PATH=$PATH:$GOPATH/bin

Multiple versions

You can have multiple versions fo Golang installed in your system. The way to manage the current version in use is to use update-alternatives

Display best options

sudo update-alternatives --display go
go - auto mode
  link best version is /usr/local/go/bin/go
  link currently points to /usr/local/go/bin/go
  link go is /usr/bin/go
/usr/local/go/bin/go - priority 2

Before

Selection    Path                  Priority   Status
 ------------------------------------------------------------
   0            /usr/bin/golang-go     10        auto mode
   1            /usr/bin/gccgo-go      5         manual mode
   2            /usr/bin/golang-go     10        manual mode

Action: Installed manually unzipped GoLang into /usr/local/go but was not added to alternatives. Use command below to add it on:

sudo update-alternatives --install "/usr/bin/go" "go" "/usr/local/go/bin/go" 2

After

Selection    Path                  Priority   Status
 ------------------------------------------------------------
 * 0            /usr/bin/golang-go     10        auto mode
   1            /usr/bin/gccgo-go      5         manual mode
   2            /usr/bin/golang-go     10        manual mode
   3            /usr/local/go/bin/go   2         manual mode

Then run command to change go binary available in your shell

sudo update-alternatives --config go  #then select ''3''

When you run

$ go version #the version of ''go'' will be the one from <tt>/usr/local/go</tt> location.

Troubleshooting

What is GOPATH?

  • it's an environment variable with a list paths to look for Go code, on Unix it's colon-separated string
  • usually GOPATH is $HOME/go where bin and src directories exists. Each time you execute go get -u <url>, the binaries will be placed in $HOME/go/bin and code in $HOME/go/src
  • therefore $HOME/go/bin needs to be in the $PATH
  • default go directory: /usr/local/go is called GOROOT
  • default go bin directory: /usr/local/go/bin that needs to be in $PATH


Allow 'sudo go <subcommand>'

sudo visudo # then add to'secure_path' '.../go/bin' directory
Defaults secure_path=".../bin:/usr/local/go/bin"


Get go environment variables

$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/ubuntu/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/ubuntu/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build629810470=/tmp/go-build -gno-record-gcc-switches"