儘管型別相同,Go 型別轉換仍可能失敗。類型轉換是在不同資料型別之間進行轉換的過程,但在Go語言中,即使兩個型別看起來相同,也不能保證轉換一定會成功。這是因為Go語言對類型的嚴格檢查,要求轉換的類型必須完全匹配,包括類型名稱、結構和方法等。因此,開發者在進行類型轉換時,一定要謹慎並遵循Go語言的類型規則,以避免轉換失敗的情況。
問題內容
我使用 jackc/pgx 驅動程式和 gorm 函式庫來與 postgresql 資料庫互動。
我有一個實例,我必須檢查 postgresql 錯誤代碼並以不同的方式處理某種錯誤類型。當使用 pgx
驅動程式時,gorm 方法傳回 *pgconn.pgerror
類型作為 error
,其中包含一個帶有特定錯誤代碼的欄位。
為了訪問該字段,我必須將 error
轉換為 *pgconn.pgerror
,但由於某種原因,這失敗了:
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" } }
註解:
-
pgx
和pgconn
套件位於同一項目內,因此它們不會傳回具有相同名稱的類型的不同版本。換句話說,我的 go.mod 中只有一個導入。 - 傳回值不為零。
- 偵錯器顯示該類型是
*pgconn.pgerror
。
解決方法
您已經解決了自己的問題,但這裡有一些可能有用的背景,以及我如何找到來源。
同一個程式中可以存在同名的包,只要它們有不同的導入路徑即可。例如,標準函式庫既有math/rand
,也有crypto/rand
,分別稱為r和
。這是 *pgconn.PgError
和 *pgconn.PgError
不同的第一個提示:它們來自不同的導入路徑。
當 Go 中的模組進行主要修訂時,它們應該更改其導入小路。這是為了保持導入路徑的向後相容性。請注意,這通常是透過更新 go.mod
檔案中的 module
宣告來完成的,而不是實際將程式碼移到子目錄中。例如,請參閱此 提交,其中 pgx
從 v4
碰撞到 v5
。這是第二個提示:來自 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
儲存庫,我在自述文件中看到:
該版本與 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中文網其他相關文章!

Golang在实际应用中表现出色,以简洁、高效和并发性著称。1)通过Goroutines和Channels实现并发编程,2)利用接口和多态编写灵活代码,3)使用net/http包简化网络编程,4)构建高效并发爬虫,5)通过工具和最佳实践进行调试和优化。

Go語言的核心特性包括垃圾回收、靜態鏈接和並發支持。 1.Go語言的並發模型通過goroutine和channel實現高效並發編程。 2.接口和多態性通過實現接口方法,使得不同類型可以統一處理。 3.基本用法展示了函數定義和調用的高效性。 4.高級用法中,切片提供了動態調整大小的強大功能。 5.常見錯誤如競態條件可以通過gotest-race檢測並解決。 6.性能優化通過sync.Pool重用對象,減少垃圾回收壓力。

Go語言在構建高效且可擴展的系統中表現出色,其優勢包括:1.高性能:編譯成機器碼,運行速度快;2.並發編程:通過goroutines和channels簡化多任務處理;3.簡潔性:語法簡潔,降低學習和維護成本;4.跨平台:支持跨平台編譯,方便部署。

關於SQL查詢結果排序的疑惑學習SQL的過程中,常常會遇到一些令人困惑的問題。最近,筆者在閱讀《MICK-SQL基礎�...

golang ...

Go語言中如何對比並處理三個結構體在Go語言編程中,有時需要對比兩個結構體的差異,並將這些差異應用到第�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具