溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Go中Protobuf基于反射API是怎樣的

發(fā)布時(shí)間:2022-01-18 13:35:09 來(lái)源:億速云 閱讀:278 作者:柒染 欄目:云計(jì)算

Go中Protobuf基于反射API是怎樣的,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

Go 的 protocol buffer 綁定是用于谷歌的語(yǔ)言無(wú)關(guān)的數(shù)據(jù)交換格式,旨在取代 JSON 用于高性能應(yīng)用程序,目的是把 protocol buffer 系統(tǒng)合并到Go 的類型系統(tǒng)中,并在運(yùn)行時(shí)實(shí)現(xiàn)其操作。

protocol buffer提供了一種方法以指定用于傳輸結(jié)構(gòu)化數(shù)據(jù)的模式。這種模式通常被轉(zhuǎn)換成一種特定于編程語(yǔ)言的表示形式,稱為綁定,使得使用高級(jí)別的接口處理 protobuf 消息變得更容易。

根據(jù)新protobuf模塊版本的作者 Joe Tsai、Damien Neil 和 Herbie Ong 的說(shuō)法,之前的protobuf實(shí)現(xiàn)已經(jīng)不能滿足 Go 開(kāi)發(fā)人員的期望了。具體來(lái)說(shuō),它雖然提供了 Go 類型和值的視圖,但是忽略了 protocol buffer 類型系統(tǒng)中的信息。

這樣做的后果就是 portobuf 注解的丟失。例如,我們可能想編寫(xiě)一個(gè)遍歷日志條目并清除任何注解(annotation)為包含敏感數(shù)據(jù)的字段的函數(shù)。注解不是 Go 類型系統(tǒng)的一部分。

舊的 portobuf 模塊的另一個(gè)局限是依賴于靜態(tài)綁定,從而阻礙了動(dòng)態(tài)消息的使用,而動(dòng)態(tài)消息的類型在編譯時(shí)不是完全可知的。

新的 protobuf 模塊 (版本為 APIv2)基于這個(gè)假設(shè):protobuf Message 必須完全指定消息的行為,并使用反射以提供 protobuf 類型的完整視圖。Go protobuf APIv2 的基石是新的 proto.Message 接口,可用于所有生成的消息類型,并提供了訪問(wèn)消息內(nèi)容的方式。這包括所有 protobuf 字段,可以使用 protoreflect.Message.Range 方式對(duì)它們進(jìn)行迭代。該方法既可以處理動(dòng)態(tài)消息,也可以訪問(wèn)消息選項(xiàng)。下面例子說(shuō)明如何處理消息以在進(jìn)一步處理前清除其包含的所有敏感信息:

// Redact清除pb中的每個(gè)敏感字段。func Redact(pb proto.Message) {    m := pb.ProtoReflect()    m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool {        opts := fd.Options().(*descriptorpb.FieldOptions)        if proto.GetExtension(opts, policypb.E_NonSensitive).(bool) {            return true        }        m.Clear(fd)        return true    })}

然而,幾個(gè)Hacker News評(píng)論者指出,Go protobuf APIv2的版本控制有點(diǎn)讓人感到困惑 。開(kāi)發(fā)人員需要把新版本綁定到一個(gè)特定的存儲(chǔ)庫(kù),而不能使用新的版本擴(kuò)展現(xiàn)有的存儲(chǔ)庫(kù),并把它標(biāo)記為 v2。Damien Neil 解釋了這一決定背后的原因,如下所示:

我們可以把新的API標(biāo)記為v2:在導(dǎo)入路徑中,把v1和v2清楚地區(qū)分開(kāi)來(lái)。讓人感到困惑的:google.golang.org/protobuf@v1不存在,而v2存在。10年后,希望沒(méi)人關(guān)心這個(gè)舊的github.com/golang/protobuf,那么,這個(gè)令人困惑的事就不存在了。我們可以把新的API標(biāo)記為v1:在導(dǎo)入路徑中難以清楚地區(qū)分開(kāi)來(lái)。把google.golang.org/protobuf的第一個(gè)版本標(biāo)記為v1是有意義的。如果我們認(rèn)為它是個(gè)糟糕的想法,那么,從v1轉(zhuǎn)到v2比從v2回退到v1更容易一些。

此外,Go protobuf APIv2 將從 1.20 版開(kāi)始。Neil 對(duì)此做了的解釋,這樣的目的是避免在錯(cuò)誤報(bào)告中出現(xiàn)版本重疊產(chǎn)生的歧義, 他認(rèn)為 Go protobuf APIv1 永遠(yuǎn)不會(huì)有 1.20 版。

最后要注意的是,APIv1 不會(huì)被 APIv2 淘汰,它會(huì)得到無(wú)限期維護(hù)。事實(shí)上,其最新的實(shí)現(xiàn)(1.4 版)是在 APIv2 之上實(shí)現(xiàn)的。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI