>  기사  >  백엔드 개발  >  golang 오류: '잘못된 포인터 수신자...' 어떻게 해결하나요?

golang 오류: '잘못된 포인터 수신자...' 어떻게 해결하나요?

PHPz
PHPz원래의
2023-06-25 10:33:05924검색

golang을 사용하여 프로젝트를 개발하다 보면 가끔 예상치 못한 오류가 발생할 수 있습니다. 그 중 하나는 "잘못된 포인터 수신자..." 오류로, 이는 일반적으로 코드의 구조를 깨뜨리고 프로그램 충돌을 일으킵니다. 이 기사에서는 이 오류의 원인을 설명하고 몇 가지 가능한 해결 방법을 제공합니다.

1. 오류 원인

Golang의 포인터는 매우 강력하지만 주의해서 사용해야 합니다. 메서드에 포인터 수신기가 정의되어 있고 메서드 호출 시 포인터가 아닌 값이 전달되면 "잘못된 포인터 수신기..." 오류가 발생합니다. 예:

type Book struct {
  Name     string
  Author   string
  Pages    int
  Progress float64
}

func (b *Book) Read(pageCount int) {
  b.Progress = float64(pageCount)/float64(b.Pages) * 100
}

func main() {
  myBook := Book{
    Name:     "Golang book",
    Author:   "John Doe",
    Pages:    200,
    Progress: 0,
  }

  myBook.Read(50) // invalid pointer receiver Book literal
}

이 예에서 Read 메서드는 포인터 수신기로 정의됩니다. 즉, 작동하려면 Book에 대한 포인터가 필요합니다. 그러나 Read 메서드를 호출하는 동안 Book 리터럴만 전달하므로 "잘못된 포인터 수신기 Book 리터럴" 오류가 발생합니다.

2. 해결 방법

오류를 해결하려면 Read 메서드 호출 시 포인터 값이 전달되는지 확인해야 합니다. 이를 달성하는 방법에는 여러 가지가 있습니다.

2.1 구조 변수 주소를 메소드에 전달

이것이 가장 일반적인 솔루션입니다. 메소드를 호출할 때 구조 변수의 주소를 전달하기만 하면 됩니다. 예:

myBook := &Book{
  Name:     "Golang book",
  Author:   "John Doe",
  Pages:    200,
  Progress: 0,
}

myBook.Read(50) // no error

이 예에서는 주소를 얻으려면 구조 변수 앞에 "&" 기호만 추가하면 됩니다. 메서드에는 Book에 대한 포인터가 필요하므로 이 주소는 Read 메서드에 전달될 수 있습니다.

2.2 메소드 수신자 변경

구조체의 리터럴 값을 메소드에 전달하고 싶다면 메소드 정의의 포인터 수신자를 포인터가 아닌 수신자로 변경해 볼 수 있습니다. 예:

func (b Book) Read(pageCount int) {
  b.Progress = float64(pageCount)/float64(b.Pages) * 100
}

func main() {
  myBook := Book{
    Name:     "Golang book",
    Author:   "John Doe",
    Pages:    200,
    Progress: 0,
  }

  myBook.Read(50) // no error
}

이 예에서는 Read 메서드의 수신자를 "*Book"에서 "Book"으로 변경했습니다. 이는 포인터 대신 Book 값이 필요하다는 의미입니다. 이제 오류 없이 Book 리터럴을 전달할 수 있습니다.

3. 요약

"잘못된 포인터 수신기..." 오류는 일반적으로 포인터 수신기를 잘못 지정하여 발생합니다. 프로그램을 작성할 때 코드의 정확성과 신뢰성을 보장하기 위해 포인터를 주의 깊게 처리해야 합니다. 이 기사에서는 주소 전달과 수신자 유형 변경이라는 두 가지 가능한 솔루션을 살펴봅니다. 이 기사가 유사한 오류를 해결하는 데 도움이 되기를 바랍니다.

위 내용은 golang 오류: '잘못된 포인터 수신자...' 어떻게 해결하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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