Heim >Backend-Entwicklung >Golang >Die Konvertierung des Go-Typs schlägt fehl, obwohl es sich um denselben Typ handelt

Die Konvertierung des Go-Typs schlägt fehl, obwohl es sich um denselben Typ handelt

WBOY
WBOYnach vorne
2024-02-13 16:45:081083Durchsuche

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

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.

Frageninhalt

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:

  1. pgxpgconn 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.
  2. Der Rückgabewert ist nicht Null.
  3. Der Debugger zeigt an, dass der Typ *pgconn.pgerror ist.

Workaround

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 声明来完成的,而不是实际将代码移动到子目录中。例如,请参阅此 提交,其中 pgxv4 碰撞到 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/pgconngithub.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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen