Por favor, explique os ponteiros &, e * no GoLang

Recentemente, comecei a aprender o GoLang. Houve várias instâncias em que o compilador gera um erro quando tento passar variáveis como argumentos nas funções Go. Consegui depurar isso algumas vezes usando um ponteiro na frente da variável. Os ponteiros &, e * parecem limpar o erro. Embora, eu gostaria de entender o porquê. Gostaria de saber qual é a diferença entre &, e * e quando cada um deve ser usado. Obrigado!

func (ctx *NewContext) SendNotification(rw http.ResponseWriter, req *http.Request, p httprouter.Params) {

    decoder := json.NewDecoder(req.Body)

    var u User

    if err := decoder.Decode(&u); err != nil {
        http.Error(rw, "could not decode request", http.StatusBadRequest)
        return
    }
}

questionAnswers(2)

yourAnswerToTheQuestion