我有一些依賴于 Proto 標準來編組/解組資料的 Redis 代碼。我使用gomega撰寫了以下測驗來測驗proto.Unmarshal:
b64Decoded, err := base64.StdEncoding.DecodeString("derp")
Expect(err).ShouldNot(HaveOccurred())
var item testRecord
err = proto.Unmarshal(b64Decoded, &item)
Expect(err).Should(HaveOccurred())
Expect(err.Error()).Should(Equal("proto:\u00a0cannot parse invalid wire-format data"))
但是,最終斷言失敗,因為預期的錯誤字串是proto: cannot parse invalid wire-format data. 這里明顯的解決方案是更改它,當我這樣做時,錯誤就會消失。直到我修改測驗并重新運行它,在這種情況下,測驗再次失敗,告訴我字串應該是proto:\u00a0cannot parse invalid wire-format data. 這個回圈無限繼續。那么,我在這里做錯了什么,我該如何解決這個問題?
uj5u.com熱心網友回復:
這個問題并不像你想象的那樣;包protobuf隨機選擇一個空格或\u00a0輸出錯誤時(我相信它是基于二進制的哈希)。你可以在這里看到這個:
// Deliberately introduce instability into the error message string to
// discourage users from performing error string comparisons.
if detrand.Bool() {
return "proto: " // use non-breaking spaces (U 00a0)
} else {
return "proto: " // use regular spaces (U 0020)
}
因此,您遇到的問題是經過深思熟慮的,旨在阻止用戶執行您正在嘗試的操作(依賴于錯誤保持不變)。您僅在更改測驗時才看到此內容的原因(并且,我猜,不是每次更改測驗時)Go都會快取測驗結果(默認情況下,測驗僅在發生更改時運行)。
就你能做些什么而言,我首先建議考慮這個測驗是否真的有必要。軟體包作者特別指出錯誤不穩定,因此在google.golang.org/protobuf/proto發布新版本時,以這種方式進行比較可能會中斷。
包測驗通過呼叫(例如這里protobuf)來解決這個問題。你不能這樣做,因為它在下面,因此,不可訪問。detrand.Disable()google.golang.org/protobuf/internal/detrandinternal
如果你真的想解決這個問題,最簡單的方法可能是strings.Contains.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/481714.html
