Qual é a diferença entre `go get` e `go install` em Go?
Olá! Recentemente comecei a estudar Go e estou tentando entender o gerenciamento de dependências e a construção de projetos. Frequentemente vejo o uso dos comandos `go get` e `go install`, mas não entendo bem qual é a diferença entre eles.
Por exemplo, quero instalar a utilidade `hey` para teste de carga. Na documentação está escrito: `go get -u github.com/rakyll/hey` e `go install github.com/rakyll/hey@latest`. Ambos os comandos parecem baixar e instalar o programa, mas notei que após `go get` o binário apareceu em `$GOPATH/bin`, e após `go install` também foi para lá, mas na pasta do projeto apareceu um arquivo `go.sum`.
Também tentei usar `go get` para adicionar uma biblioteca ao meu projeto: `go get github.com/gin-gonic/gin`. Depois disso, uma linha com a dependência apareceu em `go.mod`, e hashes em `go.sum`. Mas li que nas versões mais recentes do Go (1.16+) `go get` não é recomendado para instalar binários, apenas para gerenciar dependências.
Você pode explicar qual é exatamente a diferença? Quando devo usar