Go の型変換は、型が同じであるにもかかわらず失敗することがあります。型変換は異なるデータ型間で変換するプロセスですが、Go 言語では、2 つの型が同じに見えても、変換が成功するという保証はありません。これは、Go 言語の厳密な型チェックでは、変換された型が型名、構造体、メソッドなどを含めて正確に一致する必要があるためです。したがって、開発者は型変換を実行するときに、変換の失敗を避けるために注意して Go 言語の型規則に従う必要があります。
postgresqlデータベースとのやり取りにjackc/pgxドライバーとgormライブラリを使用しています。
postgresql エラー コードをチェックし、特定のエラー タイプを別の方法で処理する必要があるインスタンスがあります。 pgx
ドライバーを使用する場合、gorm メソッドは *pgconn.pgerror
型を error
として返します。これには、特定のエラー コードを含むフィールドが含まれます。
フィールドにアクセスするには、error
を *pgconn.pgerror
に変換する必要がありますが、何らかの理由でこれは失敗します:
コメント:
pgx
および pgconn
パッケージは 同じプロジェクト 内にあるため、同じ名前の異なるバージョンの型を返しません。つまり、go.mod にはインポートが 1 つしかありません。 *pgconn.pgerror
であることを示します。 あなた自身の問題はすでに解決されていますが、役立つ可能性のある背景と、私がソースを見つけた方法を以下に示します。
同じ名前のパッケージは、インポート パスが異なる限り、同じプログラム内に存在できます。たとえば、標準ライブラリには math/rand
と crypto/rand
の両方があり、それぞれ r と
と呼ばれます。これは、*pgconn.PgError
と *pgconn.PgError
が異なることを示す最初のヒントです。これらは、異なるインポート パスからのものです。
Go のモジュールが メジャー リビジョン になった場合、インポート パスを変更する必要があります。これは、インポート パスの下位互換性を維持するためです。これは通常、実際にコードをサブディレクトリに移動するのではなく、go.mod
ファイル内の module
宣言を更新することによって行われることに注意してください。たとえば、この Commit では、 pgx
が v4
から v5
に衝突します。 2 番目のヒントは次のとおりです。pgx
プロジェクトのコードは、複数のインポート パスで使用できます (複数のメジャー バージョンがあるため)。
この背景を念頭に置いて、git タグを使用して最新の v4.x.x
リリース を表示しました。奇妙なことに、pgconn
パッケージが v4
に存在しないことに気づきました。これにより、github.com/jackc/pgx/v4/pgconn
が github.com/jackc/pgx/v5/pgconn
と競合するという考えが除外されるようです。次に、Google で「pgconn」を検索し、github.com/jackc/pgconn
リポジトリを見つけました。Readme には次のように記載されています。
https://www.php.cn/link/a0fb5dd4b80c7e9411ba9667315d20c3 リポジトリの一部です。
提供された他の情報から判断すると、エラーはインポート パス"github.com/jackc/pgx/pgconn" を使用している可能性があります。
pgx のサンプル コードに示されているように、ベース モジュールに使用する必要がある現在のインポート パスは
"github.com/jackc/pgx/v5" であり、その中のパッケージはローカルで指定します (例:
"github .com/jackc/pgx/v5/pgconn")。
以上がGo の型が同じであるにもかかわらず型変換が失敗するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。