Go官方宣布釋出新的協定緩衝區(Protocol Buffers)API版本,其主要提供了反射(Reflection)功能,讓開發者能夠檢視協定緩衝區類型系統的數值。協定緩衝區是獨立於任何開發語言的資料交換格式,為序列化結構資料的擴充機制,與XML類似,但是更小更簡單。

Go原本的協定緩衝區套件已經釋出了十年,但是隨著使用者需求的成長,該套件也越來越不敷使用,Go官方提到,不少開發者使用Go反射套件,撰寫程式來檢查協定緩衝區的訊息,但是因為反射套件只可檢視Go的類型和數值,會忽略來自協定緩衝區類型系統的資訊。官方舉例,當開發者撰寫一個走訪日誌項目,並且清除所有註釋欄位中敏感資料的函式,但是因為註釋欄位並非Go類型系統的一部分,所以處理起來就比較麻煩。

除此之外,開發者也有使用動態訊息類型這類,非由協定緩衝區編譯器產生的資料結構的需求。官方還提到,proto.Message介面也常是問題的來源,雖然該介面會辨識生成訊息類型的值,但是卻幾乎沒有描述這些類型的行為,因此當用戶創建實作介面的類型,並將類型數值傳遞給函式,想要取得生成訊息值時,便常出現程式崩潰或是不可預期的行為。

官方表示,造成這三個問題的原因相同,而共同的解決方法,就是Message介面應該完全指定訊息的行為,而且操作Message值的函式,應該接受任何正確實作該介面的類型。由於無法在不改動Message類型現有定義的情況下,維持套件API的相容性,因此Go官方決定釋出全新協定緩衝區模組,且新版本不與舊版本相容。

而這個新版本的旗艦功能便是反射,提供類似反射套件檢視Go類型和數值的功能,協定緩衝區的反射功能,則能根據協定緩衝區的類型,提供系統數值檢視的能力,該套件包含了類型描述符,描述了來源文件和數值介面中定義的類型結構,其提供了檢查和操作訊息內容的能力。

官方把Go協定緩衝區原來的版本稱為APIv1,而新版本稱為APIv2,由於APIv1和APIv2不相容,因此使用不同的模組路徑。官方提到,因為每個開發者搬遷到新版本的速度不同,且部分程式可能會持續的使用舊版本,甚至在同一個程式中,也有可能會使用不同API版本,因此官方目前打算無限期地支援API​​v1。


Advertisement

更多 iThome相關內容