Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penukaran jenis Go gagal walaupun mempunyai jenis yang sama

Penukaran jenis Go gagal walaupun mempunyai jenis yang sama

WBOY
WBOYke hadapan
2024-02-13 16:45:081052semak imbas

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

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.

Kandungan soalan

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:

  1. pgxpgconn 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.
  2. Nilai pulangan bukan sifar.
  3. Penyahpepijat menunjukkan bahawa jenisnya ialah *pgconn.pgerror.

Penyelesaian

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

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Dapatkan rujukan teg tidak sahArtikel seterusnya:Dapatkan rujukan teg tidak sah