Maison  >  Article  >  développement back-end  >  erreur golang : "récepteur de pointeur invalide..." Comment le résoudre ?

erreur golang : "récepteur de pointeur invalide..." Comment le résoudre ?

PHPz
PHPzoriginal
2023-06-25 10:33:05905parcourir

Lorsque vous utilisez Golang pour développer des projets, vous pouvez parfois rencontrer des erreurs inattendues. L'une d'entre elles est l'erreur "récepteur de pointeur invalide...", qui brise généralement la structure du code et provoque le crash du programme. Dans cet article, je vais expliquer la cause de cette erreur et proposer quelques solutions possibles.

1. Raison de l'erreur

Les pointeurs dans Golang sont très puissants, mais ils doivent être utilisés avec beaucoup de précautions. Si un récepteur de pointeur est défini dans une méthode et qu’une valeur non-pointeur est transmise lorsque la méthode est appelée, une erreur « récepteur de pointeur invalide… » se produira. Par exemple :

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
}

Dans cet exemple, la méthode Read est définie comme un récepteur de pointeur, ce qui signifie qu'elle nécessite un pointeur vers un livre pour fonctionner. Cependant, nous transmettons uniquement un littéral Book lors de l'appel de la méthode Read, d'où l'erreur « littéral de livre du récepteur de pointeur non valide ».

2. Solution

Pour résoudre l'erreur, nous devons nous assurer que la valeur du pointeur est transmise lors de l'appel de la méthode Read. Il existe plusieurs façons d'y parvenir.

2.1 Passer l'adresse de la variable de structure à la méthode

C'est la solution la plus courante. Transmettez-lui simplement l'adresse de la variable de structure lors de l'appel de la méthode. Par exemple :

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

myBook.Read(50) // no error

Dans cet exemple, il suffit d'ajouter le symbole "&" avant la variable de structure pour obtenir son adresse. Cette adresse peut être transmise à la méthode Read puisque la méthode nécessite un pointeur vers le Book.

2.2 Changer le récepteur de la méthode

Si nous voulons vraiment transmettre la valeur littérale de la structure à la méthode, alors nous pouvons essayer de changer le récepteur du pointeur dans la définition de la méthode en Récepteur sans pointeur. Par exemple :

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
}

Dans cet exemple, nous changeons le récepteur de la méthode Read de "*Book" à "Book", ce qui signifie qu'il attend une valeur Book au lieu d'un pointeur. Nous pouvons désormais lui transmettre un livre littéral sans erreur.

3. Résumé

L'erreur "Récepteur de pointeur invalide..." est généralement causée par une spécification incorrecte du récepteur de pointeur. Lors de l’écriture d’un programme, nous devons gérer les pointeurs avec soin pour garantir l’exactitude et la fiabilité du code. Dans cet article, nous explorons deux solutions possibles : transmettre l'adresse et changer le type de destinataire. J'espère que cet article vous aidera à résoudre des erreurs similaires.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn