Bitte erläutern Sie & und * in GoLang

Ich habe kürzlich angefangen, GoLang zu lernen. Es gab mehrere Fälle, in denen der Compiler einen Fehler auslöst, wenn ich versuche, Variablen als Argumente in Go-Funktionen zu übergeben. Ich konnte dies manchmal mit einem Zeiger vor der Variablen debuggen. Die beiden Zeiger & und * scheinen den Fehler zu beseitigen. Allerdings würde ich gerne verstehen, warum. Ich frage mich, was der Unterschied zwischen & und * ist und wann jeder verwendet werden sollte. Vielen Dank

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
    }
}