Nice article!
In my opinion, this level of abstraction may be going a little far:
GOCMD=go
GOBUILD=$(GOCMD) build
GOCLEAN=$(GOCMD) clean
GOTEST=$(GOCMD) test
GOGET=$(GOCMD) get
It might seem like a good idea to constantize everything, but in practice, those commands are never going to change.By just invoking them directly in the targets you'll come out with something more readable and no less maintainable:
build:
go build -o $(BINARY_NAME) -v