use 'defer' to release resources before return

func getUser() (User, error) {
    resp, err := http.Get("https://example.tld/users")
    if err != nil{
        return User{}, err
    }

    dat, err := io.ReadAll(resp.Body)
    if err != nil {
        resp.Body.Close()  // you need to close it each time
        return err
    }

    user := User{}
    err = json.Unmarshal(dat, &user)
    resp.Body.Close()   // you need to close it each time
    return user, err
}

// By defer, you can do this
func getUser() (User, error) {
    resp, err := http.Get("https://example.tld/users")
    if err != nil{
        return User{}, err
    }
    defer resp.Body.Close()  // just set once, it will auto run later   

    dat, err := io.ReadAll(resp.Body)
    if err != nil{
        return err
    }

    user := User{}
    err = json.Unmarshal(dat, &user)
    return user, err
}

defer is a LIFO(last in first out) stack, it will run after the current function is run over . Notice that it run before return occured.

this snippet from here.