ChatGPT가 알려준 net/http를 사용하여 요청하는 기본 구문은 아래와 같다.
import ..생략..
func main() {
// HTTP GET 요청 보내기
url := "https://example.com/"
response, err := http.Get(url)
if err != nil {
fmt.Println("Error sending HTTP request:", err)
return
}
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
if err != nil {
fmt.Println("Error reading response body:", err)
return
}
}
중간에 defer response.Body.Close()는 왜 존재하는걸까?
먼저 response.Body의 정의를 확인해보자. 호출자가 Body를 close해야하며, 연결을 재사용하려면 read도 해줘야한다고 적혀있다.

Body는 ReadCloser 인터페이스를 따르며, 여기에는 Close() 함수가 정의 된 Closer 인터페이스가 존재한다.

defer response.Body.Close()를 사용하면 해당 함수가 종료될 때 자동으로 Close 메서드가 호출되므로, 함수가 끝나거나 반환되기 전에 response.Body를 닫을 수 있다.