ホームページ >バックエンド開発 >Golang >Go の型が同じであるにもかかわらず型変換が失敗する

Go の型が同じであるにもかかわらず型変換が失敗する

WBOY
WBOY転載
2024-02-13 16:45:081073ブラウズ

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

Go の型変換は、型が同じであるにもかかわらず失敗することがあります。型変換は異なるデータ型間で変換するプロセスですが、Go 言語では、2 つの型が同じに見えても、変換が成功するという保証はありません。これは、Go 言語の厳密な型チェックでは、変換された型が型名、構造体、メソッドなどを含めて正確に一致する必要があるためです。したがって、開発者は型変換を実行するときに、変換の失敗を避けるために注意して Go 言語の型規則に従う必要があります。

質問内容

postgresqlデータベースとのやり取りにjackc/pgxドライバーとgormライブラリを使用しています。

postgresql エラー コードをチェックし、特定のエラー タイプを別の方法で処理する必要があるインスタンスがあります。 pgx ドライバーを使用する場合、gorm メソッドは *pgconn.pgerror 型を error として返します。これには、特定のエラー コードを含むフィールドが含まれます。

フィールドにアクセスするには、error*pgconn.pgerror に変換する必要がありますが、何らかの理由でこれは失敗します:

リーリー

コメント:

  1. pgx および pgconn パッケージは 同じプロジェクト 内にあるため、同じ名前の異なるバージョンの型を返しません。つまり、go.mod にはインポートが 1 つしかありません。
  2. 戻り値はゼロではありません。
  3. デバッガーは、タイプが *pgconn.pgerror であることを示します。

解決策

あなた自身の問題はすでに解決されていますが、役立つ可能性のある背景と、私がソースを見つけた方法を以下に示します。

同じ名前のパッケージは、インポート パスが異なる限り、同じプログラム内に存在できます。たとえば、標準ライブラリには math/randcrypto/rand の両方があり、それぞれ r と と呼ばれます。これは、*pgconn.PgError*pgconn.PgError が異なることを示す最初のヒントです。これらは、異なるインポート パスからのものです。

Go のモジュールが メジャー リビジョン になった場合、インポート パスを変更する必要があります。これは、インポート パスの下位互換性を維持するためです。これは通常、実際にコードをサブディレクトリに移動するのではなく、go.mod ファイル内の module 宣言を更新することによって行われることに注意してください。たとえば、この Commit では、 pgxv4 から v5 に衝突します。 2 番目のヒントは次のとおりです。pgx プロジェクトのコードは、複数のインポート パスで使用できます (複数のメジャー バージョンがあるため)。

この背景を念頭に置いて、git タグを使用して最新の v4.x.x リリース を表示しました。奇妙なことに、pgconn パッケージが v4 に存在しないことに気づきました。これにより、github.com/jackc/pgx/v4/pgconngithub.com/jackc/pgx/v5/pgconn と競合するという考えが除外されるようです。次に、Google で「pgconn」を検索し、github.com/jackc/pgconn リポジトリを見つけました。Readme には次のように記載されています。

このバージョンは pgx v4 で使用されます。 pgx v5 では、

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 サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。