Maison  >  Article  >  développement back-end  >  Comment résoudre l'erreur Golang : impossible de faire référence au nom 'x' non exporté dans le package 'y', stratégie de solution

Comment résoudre l'erreur Golang : impossible de faire référence au nom 'x' non exporté dans le package 'y', stratégie de solution

PHPz
PHPzoriginal
2023-08-20 16:30:331365parcourir

如何解决golang报错:cannot refer to unexported name 'x' in package 'y',解决策略

Comment résoudre l'erreur golang : "impossible de faire référence au nom 'x' non exporté dans le package 'y'

Pendant le processus de développement utilisant golang, nous pouvons rencontrer l'erreur suivante : "impossible de faire référence au nom 'x' non exporté dans le package 'y'", cette erreur est principalement provoquée lorsque nous accédons à des variables ou des fonctions non exportées.

En golang, la casse de la première lettre des noms de variables et de fonctions détermine leur visibilité. Un identifiant est exportable si sa première lettre est une lettre majuscule ; si sa première lettre est une lettre minuscule, il n'est pas exportable. Les variables ou fonctions non exportables ne sont accessibles que dans le même package et ne sont pas directement accessibles par d'autres packages. Lorsque nous essayons d'accéder à des variables ou à des fonctions non exportées dans d'autres packages, l'erreur ci-dessus se produit.

Alors, comment résoudre ce problème ? Voici plusieurs stratégies de solution :

  1. Changer la variable ou la fonction à exporter : Si nous devons accéder à une variable ou à une fonction dans d'autres packages, nous pouvons alors changer sa première lettre en majuscule afin qu'elle puisse être exportée. Par exemple, si nous avons une variable nommée "x" qui n'est pas accessible en dehors du package, nous pouvons la remplacer par "X".

Exemple de code :

package y

var x string // 不可导出的变量

func foo() {
    // 不可导出的函数
}

Code modifié :

package y

var X string // 可导出的变量

func Foo() {
    // 可导出的函数
}
  1. Accès dans le même package : si nous ne pouvons pas modifier une variable ou une fonction à exporter, mais que nous devons l'utiliser dans d'autres packages, nous pouvons l'utiliser dans une fonction est fourni dans le même package pour accéder indirectement à cette variable ou fonction. De cette façon, d'autres packages peuvent obtenir les résultats requis en appelant cette fonction.

Exemple de code :

package y

var x string // 不可导出的变量

func getX() string {
    return x
}

Appel dans d'autres packages :

package main

import (
    "fmt"
    "package/y"
)

func main() {
    x := y.getX()
    fmt.Println(x)
}
  1. Utiliser des interfaces pour masquer les détails d'implémentation : s'il existe des types privés dans un package (la première lettre est en minuscule), mais nous espérons que d'autres packages ne peuvent que appeler public lorsqu'il est utilisé Les méthodes peuvent encapsuler ces types privés en tant qu'interfaces et exposer cette interface de manière publique. De cette manière, les autres packages ne peuvent accéder à ces types que via l'interface, mais ne peuvent pas accéder directement aux méthodes privées ou aux propriétés de leurs objets d'implémentation.

Exemple de code :

package y

type privateType struct {
    data int
}

func (p *privateType) privateMethod() {
    fmt.Println(p.data)
}

type PublicInterface interface {
    PublicMethod()
}

func CreatePrivateType() PublicInterface {
    return &privateType{}
}

func (p *privateType) PublicMethod() {
    p.privateMethod()
}

Utilisé dans d'autres packages :

package main

import (
    "package/y"
)

func main() {
    p := y.CreatePrivateType()
    p.PublicMethod() // 可以调用
    p.privateMethod() // 无法调用,报错
}

Grâce aux solutions ci-dessus, nous pouvons résoudre l'erreur golang : "ne peut pas faire référence au nom 'x' non exporté dans le package 'y'". Choisir la stratégie appropriée en fonction de la situation spécifique peut rendre notre code plus lisible, maintenable et améliorer la réutilisabilité du code.

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