Maison > développement back-end > Golang > La conversion de type Go échoue malgré le même type

La conversion de type Go échoue malgré le même type

WBOY
Libérer: 2024-02-13 16:45:08
avant
1075 Les gens l'ont consulté

尽管类型相同,Go 类型转换仍失败

La conversion de type Go peut échouer même si le type est le même. La conversion de type est le processus de conversion entre différents types de données, mais dans le langage Go, même si deux types se ressemblent, rien ne garantit que la conversion réussira. En effet, la vérification stricte des types du langage Go exige que les types convertis correspondent exactement, y compris les noms de types, les structures, les méthodes, etc. Par conséquent, les développeurs doivent être prudents et suivre les règles de type du langage Go lors de la conversion de type pour éviter les échecs de conversion.

Contenu de la question

J'utilise le pilote jackc/pgx et la bibliothèque gorm pour interagir avec la base de données postgresql.

J'ai un cas où je dois vérifier les codes d'erreur postgresql et gérer différemment un certain type d'erreur. Lors de l'utilisation de pgx 驱动程序时,gorm 方法返回 *pgconn.pgerror 类型作为 error, il contient un champ avec un code d'erreur spécifique.

Pour accéder au champ, je dois error 转换为 *pgconn.pgerror mais pour une raison quelconque, cela échoue :

res := tx.Take(&f, "id = ?", id)
if res.Error != nil {
    if pqErr, ok := res.Error.(*pgconn.PgError); ok {
        // does not reach here
    } else {
        fmt.Printf("Error type: %T\n", res.Error)
        // Output: "Error type: *pgconn.PgError"
    }
}
Copier après la connexion

Remarque :

  1. pgxpgconn Les packages se trouvent dans le même projet, ils ne renvoient donc pas différentes versions de types portant le même nom. En d’autres termes, je n’ai qu’une seule importation dans mon go.mod.
  2. La valeur de retour n'est pas nulle.
  3. Le débogueur montre que le type est *pgconn.pgerror.

Solution de contournement

Vous avez déjà résolu votre problème, mais voici quelques informations générales qui pourraient être utiles et comment j'ai trouvé la source.

Les packages portant le même nom peuvent exister dans le même programme, à condition qu'ils aient des chemins d'importation différents. Par exemple, la bibliothèque standard a les deux math/rand,也有crypto/rand,分别称为r和。这是 *pgconn.PgError*pgconn.PgError premiers indices différents : ils proviennent de chemins d'importation différents.

Lorsque les modules de Go subissent des révisions majeures, ils doivent modifier leurs chemins d'importation. Il s’agit de maintenir la compatibilité ascendante des chemins d’importation. Notez que cela se fait généralement en mettant à jour la déclaration module dans le fichier go.mod, plutôt qu'en déplaçant réellement le code dans le sous-répertoire. Par exemple, voir ce commit go.mod 文件中的 module 声明来完成的,而不是实际将代码移动到子目录中。例如,请参阅此 提交,其中 pgxv4 碰撞到 v5 。这是第二个提示:来自 pgx, où pgx provient de v4 entre en collision avec <code>v5. Voici le deuxième conseil : le code du projet pgx peut être utilisé sous plusieurs chemins d'importation (en raison de plusieurs versions majeures).

Dans ce contexte, j'ai utilisé la balise git pour afficher le dernier v4.x.x Publier v4.x.x 发布。我注意到奇怪的是,pgconn 包在 v4 中不存在。这似乎排除了 github.com/jackc/pgx/v4/pgconngithub.com/jackc/pgx/v5/pgconn 冲突的想法。然后我在 Google 上搜索“pgconn”并找到了 github.com/jackc/pgconn. J'ai remarqué étrangement que le package pgconn n'existe pas dans v4. Cela semble exclure l'idée que github.com/jackc/pgx/v4/pgconn soit en conflit avec github.com/jackc/pgx/v5/pgconn. Ensuite, j'ai cherché "pgconn" sur Google et j'ai trouvé le référentiel github.com/jackc/pgconn, que j'ai vu dans le fichier readme :

Cette version fonctionne avec pgx v4. Dans pgx v5, il fait partie du référentiel https://www.php.cn/link/a0fb5dd4b80c7e9411ba9667315d20c3.

D'après les autres informations que vous avez fournies, votre erreur est peut-être d'utiliser un chemin d'importation "github.com/jackc/pgx/pgconn"。如 pgx 的示例代码所示,您应该用于基本模块的当前导入路径是 "github.com/jackc/pgx/v5",并且其中的包将被类似地指定,例如 "github .com/jackc/pgx/v5/pgconn".

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal