Go에서는 요청이 취소되었는지 확인하는 것이 어려울 수 있습니다. 다음 코드를 고려해보세요.
package main import ( "context" "log" "net/http" ) func main() { r, _ := http.NewRequest("GET", "http://example.com", nil) ctx, cancel := context.WithCancel(context.Background()) r = r.WithContext(ctx) ch := make(chan bool) go func() { _, err := http.DefaultClient.Do(r) log.Println(err == context.Canceled) ch <- true }() cancel() <-ch }
놀랍게도 이 코드는 요청이 취소되어야 함에도 불구하고 Go 1.9에서 false를 인쇄합니다.
최신 버전 취소를 확인하는 더 좋은 방법은 오류를 사용하는 것입니다. Go 1.13에 도입된 기능입니다. 업데이트된 코드 버전은 다음과 같습니다.
import ( "context" "errors" "log" "net/http" ) func main() { // Create a context that is already canceled ctx, cancel := context.WithCancel(context.Background()) cancel() // Create the request with it r, _ := http.NewRequestWithContext(ctx, "GET", "http://example.com", nil) // Do it, it will immediately fail because the context is canceled. _, err := http.DefaultClient.Do(r) log.Println(err) // Get http://example.com: context canceled // This prints false, because the http client wraps the context.Canceled // error into another one with extra information. log.Println(err == context.Canceled) // This prints true, because errors.Is checks all the errors in the wrap chain, // and returns true if any of them matches. log.Println(errors.Is(err, context.Canceled)) }
errors.Is를 사용하면 다른 오류로 인해 래핑된 경우에도 기본 오류가 컨텍스트 취소 오류인지 확실하게 확인할 수 있습니다. error.Is 함수는 전체 오류 체인을 순회하고 그 중 하나라도 주어진 오류 유형과 일치하면 true를 반환합니다.
위 내용은 다른 오류로 인해 래핑된 경우에도 Go에서 요청 취소 오류를 안정적으로 확인하려면 어떻게 해야 하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!