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.