>백엔드 개발 >Golang >Go 코드에서 '패닉: 런타임 오류: 잘못된 메모리 주소 또는 nil 포인터 역참조' 오류가 발생하는 이유는 무엇입니까?

Go 코드에서 '패닉: 런타임 오류: 잘못된 메모리 주소 또는 nil 포인터 역참조' 오류가 발생하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-26 05:06:10803검색

Why am I getting a

Go: 패닉: 런타임 오류: 잘못된 메모리 주소 또는 nil 포인터 역참조

문제

Go를 호출할 때 다음 메시지와 함께 명시적으로 패닉이 발생합니다. :

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x38 pc=0x26df]

goroutine 1 [running]:
main.getBody(0x1cdcd4, 0xf800000004, 0x1f2b44, 0x23, 0xf84005c800, ...)
        /Users/matt/Dropbox/code/go/scripts/cron/fido.go:65 +0x2bb
main.getToken(0xf84005c7e0, 0x10)
        /Users/matt/Dropbox/code/go/scripts/cron/fido.go:140 +0x156
main.main()
        /Users/matt/Dropbox/code/go/scripts/cron/fido.go:178 +0x61

goroutine 2 [syscall]:
created by runtime.main
        /usr/local/Cellar/go/1.0.3/src/pkg/runtime/proc.c:221

goroutine 3 [syscall]:
syscall.Syscall6()
        /usr/local/Cellar/go/1.0.3/src/pkg/syscall/asm_darwin_amd64.s:38 +0x5
syscall.kevent(0x6, 0x0, 0x0, 0xf840085188, 0xa, ...)
        /usr/local/Cellar/go/1.0.3/src/pkg/syscall/zsyscall_darwin_amd64.go:199 +0x88
syscall.Kevent(0xf800000006, 0x0, 0x0, 0xf840085188, 0xa0000000a, ...)
        /usr/local/Cellar/go/1.0.3/src/pkg/syscall/syscall_bsd.go:546 +0xa4
net.(*pollster).WaitFD(0xf840085180, 0xf840059040, 0x0, 0x0, 0x0, ...)
        /usr/local/Cellar/go/1.0.3/src/pkg/net/fd_darwin.go:96 +0x185
net.(*pollServer).Run(0xf840059040, 0x0)
        /usr/local/Cellar/go/1.0.3/src/pkg/net/fd.go:236 +0xe4
created by net.newPollServer
        /usr/local/Cellar/go/1.0.3/src/pkg/net/newpollserver.go:35 +0x382

답변

패닉: 런타임 오류: 잘못된 메모리 주소 또는 nil 포인터 역참조는 리소스에 메모리 주소가 부족할 때 발생하며, 이를 nil 포인터 역참조라고 합니다. 이는 일반적으로 아무것도 가리키는 포인터를 사용하려고 하거나 nil 포인터의 필드에 액세스할 때 발생합니다.

이 문제를 해결하려면:

  1. nil을 확인하세요. 포인터: nil에 변수나 구조 필드를 할당하지 않았는지 확인하세요. 값.
  2. 메모리 주소 유효성 검사: 존재하지 않는 메모리 주소에 액세스하려고 시도하고 있지 않은지 확인하세요. & 연산자를 활용하여 변수 또는 구조체 필드의 주소를 가져옵니다.
  3. 코드 디버그: delve와 같은 디버거 또는 내장 디버그 패키지를 사용하여 코드를 단계별로 살펴보고 식별합니다. 어떤 라인이 패닉을 일으키고 있는지. 오류 메시지에 제공된 스택 추적은 문제가 있는 코드를 찾아내는 데 도움이 될 수 있습니다.
  4. 스택 추적 검사: 스택 추적은 패닉을 초래하는 함수 호출에 대한 귀중한 정보를 제공합니다. 문제의 원인을 식별하는 데 도움이 될 수 있습니다.

주어진 코드에서 닫기를 시도할 때 getBody 함수에서 패닉이 발생했습니다. 입술.바디. func (*Client) Do 문서에 따르면 오류는 클라이언트 정책이나 HTTP 프로토콜 오류로 인해 발생한 경우에만 반환되며 성공적인 응답에는 항상 nil이 아닌 본문이 포함됩니다.

권장되는 수정 사항은 다음과 같습니다. :

res, err := client.Do(req)

if err != nil {
    return nil, err
}
defer res.Body.Close()

res.Body를 사용하기 전에 오류를 확인하면 요청 중에 발생할 수 있는 오류를 우아하게 처리하고 오류를 피할 수 있습니다. 패닉.

위 내용은 Go 코드에서 '패닉: 런타임 오류: 잘못된 메모리 주소 또는 nil 포인터 역참조' 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.