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.
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" } }
Remarque :
pgx
和 pgconn
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. *pgconn.pgerror
. 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
声明来完成的,而不是实际将代码移动到子目录中。例如,请参阅此 提交,其中 pgx
从 v4
碰撞到 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/pgconn
与 github.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 //m.sbmmt.com/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!