<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                相對于很多的語言來說, Go 的 JSON 解析可謂簡單至極. 問題 通常情況下, 我們在 Go 中經常這樣進行 JSON 的解碼: ~~~ package main import "encoding/json" // jsonText comes from http://json.org/example.html var jsonText = []byte(` { "glossary":{ "title":"example glossary", "GlossDiv":{ "title":"S", "GlossList":{ "GlossEntry":{ "ID":"SGML", "SortAs":"SGML", "GlossTerm":"Standard Generalized Markup Language", "Acronym":"SGML", "Abbrev":"ISO 8879:1986", "GlossDef":{ "para":"A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso":[ "GML", "XML" ] }, "GlossSee":"markup" } } } } }`) type glossary struct { Glossary struct { Title string `json:"title"` GlossDiv struct { Title string `json:"title"` GlossList struct { GlossEntry struct { ID string `json:"ID"` SortAs string `json:"SortAs"` GlossTerm string `json:"GlossTerm"` Acronym string `json:"Acronym"` Abbrev string `json:"Abbrev"` GlossDef struct { Para string `json:"para"` GlossSeeAlso []string `json:"GlossSeeAlso"` } `json:"GlossDef"` GlossSee string `json:"GlossSee"` } `json:"GlossEntry"` } `json:"GlossList"` } `json:"GlossDiv"` } `json:"glossary"` } func main() { var g glossary json.Unmarshal(jsonText, &g) } ~~~ 這樣的解碼對于我們日常使用好像也沒什么問題, 起碼能用 ? 對于一段 JSON, 我們解碼的時候未必需要立即解碼所有的部分, 什么意思呢 ? 拿上面的例子代碼來說, 我們解碼 jsonText , 可能僅需要馬上使用 Title 和 GlossDiv.Title . 那么對于這種情況我們怎么做合適呢 ? ~~~ package main import "encoding/json" // jsonText comes from http://json.org/example.html var jsonText = []byte(` { ... // 此處省略, 同上 }`) type glossarySectional struct { Glossary struct { Title string `json:"title"` GlossDiv struct { Title string `json:"title"` GlossList json.RawMessage `json:"GlossList"` // diff: delay JSON decoding } `json:"GlossDiv"` } `json:"glossary"` } func main() { var g glossarySectional json.Unmarshal(jsonText, &g) } ~~~ 沒錯, 魔法就在 GlossList json.RawMessage . 我們看相關文檔怎么說: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. 一目了然, RawMessage 起到了延遲解碼一個 JSON 值的作用. 那么你可能會說, 這有啥用呢 ? 這對于普通的解碼可能問題不大, 但是對于一些像消息傳遞(Kafka 這種), 細微的延遲可能會造成很大的影響. 我們可以通過簡單的 benchmark 測試一下這細微的差別: ~~~ // 其他代碼略 ... 完整代碼參見: http://bit.ly/2skxY9L . func benchmarkJSONUnmarshal(f func(), b *testing.B) { for n := 0; n < b.N; n++ { f() } } func BenchmarkJSONUnmarshal_0(b *testing.B) { benchmarkJSONUnmarshal(func() { var g glossary json.Unmarshal(jsonText, &g) }, b) } func BenchmarkJSONUnmarshal_1(b *testing.B) { benchmarkJSONUnmarshal(func() { var g glossarySectional json.Unmarshal(jsonText, &g) }, b) } ~~~ 我們通過運行 go test -run=NONE -bench=. ./... 可以得出(不同環境有略微差別): ~~~ BenchmarkJSONUnmarshal_0-8 200000 10565 ns/op BenchmarkJSONUnmarshal_1-8 200000 7699 ns/op ~~~ 差別幅度: ~~~ benchmark old ns/op new ns/op delta BenchmarkJSONUnmarshal-8 10298 7591 -26.29% ~~~ 可以看得出這個差別還是很大的, 特別是當 JSON 本身體量很大的時候. 結論 對于一些關乎性能的 JSON 解析的處理, 我們可以通過 json.RawMessage 進行性能的提升. ![](https://box.kancloud.cn/032176b8778dbc41f1ce6b79a83d59c1_900x350.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看