Rumah > Artikel > pembangunan bahagian belakang > Penukaran jenis Go gagal walaupun mempunyai jenis yang sama
Penukaran jenis Go boleh gagal walaupun mempunyai jenis yang sama. Penukaran jenis ialah proses menukar antara jenis data yang berbeza, tetapi dalam bahasa Go, walaupun dua jenis kelihatan sama, tiada jaminan bahawa penukaran akan berjaya. Ini kerana semakan jenis ketat bahasa Go memerlukan jenis yang ditukar mesti sepadan dengan tepat, termasuk nama jenis, struktur, kaedah, dsb. Oleh itu, pembangun mesti berhati-hati dan mengikut peraturan jenis bahasa Go semasa melakukan penukaran jenis untuk mengelakkan kegagalan penukaran.
Saya menggunakan pemacu jackc/pgx dan perpustakaan gorm untuk berinteraksi dengan pangkalan data postgresql.
Saya mempunyai contoh di mana saya perlu menyemak kod ralat postgresql dan mengendalikan jenis ralat tertentu secara berbeza. Apabila menggunakan pgx
驱动程序时,gorm 方法返回 *pgconn.pgerror
类型作为 error
, ia mengandungi medan dengan kod ralat tertentu.
Untuk mengakses medan saya perlu error
转换为 *pgconn.pgerror
tetapi atas sebab tertentu ini gagal:
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" } }
Nota:
pgx
和 pgconn
Pakej ada di dalam projek yang sama, jadi ia tidak mengembalikan versi jenis yang berbeza dengan nama yang sama. Dalam erti kata lain, saya hanya mempunyai satu import dalam go.mod saya. *pgconn.pgerror
. Anda telah pun menyelesaikan masalah anda sendiri, tetapi berikut ialah beberapa latar belakang yang mungkin membantu, dan cara saya menemui sumbernya.
Pakej dengan nama yang sama boleh wujud dalam program yang sama, asalkan ia mempunyai laluan import yang berbeza. Contohnya, perpustakaan standard mempunyai kedua-dua math/rand
,也有crypto/rand
,分别称为r和
。这是 *pgconn.PgError
和 *pgconn.PgError
pembayang pertama yang berbeza: ia datang daripada laluan import yang berbeza.
Apabila modul dalam Go menjalani semakan besar, mereka harus menukar laluan importnya. Ini adalah untuk mengekalkan keserasian ke belakang bagi laluan import. Ambil perhatian bahawa ini biasanya dilakukan dengan mengemas kini perisytiharan modul
dalam fail go.mod
, dan bukannya memindahkan kod ke dalam subdirektori. Sebagai contoh, lihat commit go.mod
文件中的 module
声明来完成的,而不是实际将代码移动到子目录中。例如,请参阅此 提交,其中 pgx
从 v4
碰撞到 v5
。这是第二个提示:来自 pgx
ini, dengan pgx
daripada v4 bertembung dengan <code>v5
. Berikut ialah petua kedua: kod daripada projek pgx
boleh digunakan di bawah berbilang laluan import (disebabkan oleh berbilang versi utama).
Dengan mengambil kira latar belakang ini, saya menggunakan teg git untuk melihat v4.x.x
terbaharu Catatan v4.x.x
发布。我注意到奇怪的是,pgconn
包在 v4
中不存在。这似乎排除了 github.com/jackc/pgx/v4/pgconn
与 github.com/jackc/pgx/v5/pgconn
冲突的想法。然后我在 Google 上搜索“pgconn”并找到了 github.com/jackc/pgconn
. Saya perasan pelik bahawa pakej pgconn
tidak wujud dalam v4
. Ini nampaknya menolak idea bahawa github.com/jackc/pgx/v4/pgconn
bercanggah dengan github.com/jackc/pgx/v5/pgconn
. Kemudian saya Google "pgconn" dan menemui repositori github.com/jackc/pgconn
, yang saya lihat dalam readme:
Versi ini berfungsi dengan pgx v4. Dalam pgx v5, ia adalah sebahagian daripada https://www.php.cn/link/a0fb5dd4b80c7e9411ba9667315d20c3 repositori.
Daripada maklumat lain yang anda berikan, kesilapan anda mungkin menggunakan laluan import "github.com/jackc/pgx/pgconn"
。如 pgx
的示例代码所示,您应该用于基本模块的当前导入路径是 "github.com/jackc/pgx/v5"
,并且其中的包将被类似地指定,例如 "github .com/jackc/pgx/v5/pgconn"
.
Atas ialah kandungan terperinci Penukaran jenis Go gagal walaupun mempunyai jenis yang sama. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!