Die Go-Typkonvertierung kann trotz des gleichen Typs fehlschlagen. Bei der Typkonvertierung handelt es sich um den Prozess der Konvertierung zwischen verschiedenen Datentypen. In der Go-Sprache gibt es jedoch keine Garantie dafür, dass die Konvertierung erfolgreich ist, selbst wenn zwei Typen gleich aussehen. Dies liegt daran, dass die strenge Typprüfung der Go-Sprache erfordert, dass die konvertierten Typen genau übereinstimmen müssen, einschließlich Typnamen, Strukturen, Methoden usw. Daher müssen Entwickler bei der Typkonvertierung vorsichtig sein und die Typregeln der Go-Sprache befolgen, um Konvertierungsfehler zu vermeiden.
Ich verwende den Jackc/Pgx-Treiber und die Gorm-Bibliothek, um mit der Postgresql-Datenbank zu interagieren.
Ich habe einen Fall, in dem ich Postgresql-Fehlercodes überprüfen und einen bestimmten Fehlertyp anders behandeln muss. Bei Verwendung von pgx
驱动程序时,gorm 方法返回 *pgconn.pgerror
类型作为 error
enthält es ein Feld mit einem bestimmten Fehlercode.
Um auf das Feld zuzugreifen, muss ich error
转换为 *pgconn.pgerror
, aber aus irgendeinem Grund schlägt dies fehl:
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" } }
Hinweis:
pgx
和 pgconn
Pakete befinden sich innerhalb desselben Projekts, sodass sie keine unterschiedlichen Versionen von Typen mit demselben Namen zurückgeben. Mit anderen Worten, ich habe nur einen Import in meinem go.mod. *pgconn.pgerror
ist. Sie haben Ihr Problem bereits gelöst, aber hier sind einige Hintergrundinformationen, die hilfreich sein könnten, und wie ich die Quelle gefunden habe.
Pakete mit demselben Namen können im selben Programm existieren, solange sie unterschiedliche Importpfade haben. Die Standardbibliothek hat beispielsweise beide math/rand
,也有crypto/rand
,分别称为r和
。这是 *pgconn.PgError
和 *pgconn.PgError
unterschiedliche erste Hinweise: Sie stammen aus unterschiedlichen Importpfaden.
Wenn Module in Go großen Überarbeitungen unterzogen werden, sollten sie ihre Importpfade ändern. Dadurch soll die Abwärtskompatibilität der Importpfade gewährleistet werden. Beachten Sie, dass dies normalerweise durch Aktualisieren der module
-Deklaration in der Datei go.mod
erfolgt, anstatt den Code tatsächlich in das Unterverzeichnis zu verschieben. Sehen Sie sich zum Beispiel dieses Commit go.mod
文件中的 module
声明来完成的,而不是实际将代码移动到子目录中。例如,请参阅此 提交,其中 pgx
从 v4
碰撞到 v5
。这是第二个提示:来自 pgx
an, wobei pgx
von v4 kollidiert mit <code>v5
. Hier ist der zweite Tipp: Code aus dem pgx
-Projekt kann unter mehreren Importpfaden verwendet werden (aufgrund mehrerer Hauptversionen).
Vor diesem Hintergrund im Hinterkopf habe ich das Git-Tag verwendet, um die neueste v4.x.x
Beitrag v4.x.x
发布。我注意到奇怪的是,pgconn
包在 v4
中不存在。这似乎排除了 github.com/jackc/pgx/v4/pgconn
与 github.com/jackc/pgx/v5/pgconn
冲突的想法。然后我在 Google 上搜索“pgconn”并找到了 github.com/jackc/pgconn
. Mir ist seltsamerweise aufgefallen, dass das Paket pgconn
in v4
nicht existiert. Dies scheint die Idee auszuschließen, dass github.com/jackc/pgx/v4/pgconn
mit github.com/jackc/pgx/v5/pgconn
in Konflikt steht. Dann habe ich nach „pgconn“ gegoogelt und das github.com/jackc/pgconn
-Repository gefunden, das ich in der Readme-Datei gesehen habe:
Diese Version funktioniert mit pgx v4. In pgx v5 ist es Teil des https://www.php.cn/link/a0fb5dd4b80c7e9411ba9667315d20c3-Repositorys.
Den anderen von Ihnen bereitgestellten Informationen zufolge liegt Ihr Fehler möglicherweise in der Verwendung eines Importpfads "github.com/jackc/pgx/pgconn"
。如 pgx
的示例代码所示,您应该用于基本模块的当前导入路径是 "github.com/jackc/pgx/v5"
,并且其中的包将被类似地指定,例如 "github .com/jackc/pgx/v5/pgconn"
.
Das obige ist der detaillierte Inhalt vonDie Konvertierung des Go-Typs schlägt fehl, obwohl es sich um denselben Typ handelt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!