<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ## interface底層結構 ![](https://img.kancloud.cn/5c/8c/5c8c8f3b98e5f907ff475cf6255c63db_705x332.png) * `runtime.eface`?結構體:表示不包含任何方法的空接口,也稱為 empty interface。 * `runtime.iface`?結構體:表示包含方法的接口。 **只有當interface 的 type和data 都是nil的時候才是nil,有一個不是nil,就不能判斷是不是nil** ### runtime.eface ``` type?eface?struct?{ ?_type?*_type //類型 ?data??unsafe.Pointer // 值的指針 } //type的結構體 type?_type?struct?{ ?size???????uintptr ?ptrdata????uintptr? hash???????uint32 ?tflag??????tflag ?align??????uint8 ?fieldAlign?uint8 ?kind???????uint8 ?equal?func(unsafe.Pointer,?unsafe.Pointer)?bool ?gcdata????*byte ?str???????nameOff ?ptrToThis?typeOff } ``` * size:類型的大小。 * ptrdata:包含所有指針的內存前綴的大小。 * hash:類型的 hash 值。此處提前計算好,可以避免在哈希表中計算。 * tflag:額外的類型信息標志。此處為類型的 flag 標志,主要用于反射。 * align:對應變量與該類型的內存對齊大小。 * fieldAlign:對應類型的結構體的內存對齊大小。 * kind:類型的枚舉值。包含 Go 語言中的所有類型,例如:`kindBool`、`kindInt`、`kindInt8`、`kindInt16`?等。 * equal:用于比較此對象的回調函數。 * gcdata:存儲垃圾收集器的 GC 類型數據。 總結一句,就是類型信息所需的信息都會存儲在這里面,其中包含字節大小、類型標志、內存對齊、GC 等相關屬性。而在?`eface`?來講,其由于沒有方法集的包袱,因此只需要存儲類型和值信息的指針即可,非常簡單。 ### runtime.iface ``` type?iface?struct?{ ?tab??*itab ?data?unsafe.Pointer } //itab結構體 type?itab?struct?{ ?inter?*interfacetype ?_type?*_type hash??uint32? ?_?????[4]byte ?fun???[1]uintptr? } ``` * `inter`:接口的類型信息。 * `_type`:具體類型信息 * `hash`:`_type.hash`?的副本,用于目標類型和接口變量的類型對比判斷。 * `fun`:底層數組,存儲接口的方法集的具體實現的地址,其包含一組函數指針,實現了接口方法的動態分派,且每次在接口發生變更時都會更新。 #### interfacetype ``` type?interfacetype?struct?{ ?typ?????_type ?pkgpath?name ?mhdr????[]imethod } type?nameOff?int32 type?typeOff?int32 type?imethod?struct?{ ?name?nameOff ?ityp?typeOff } ``` * `_type`:接口的具體類型信息。 * `pkgpath`:接口的包(package)名信息。 * `mhdr`:接口所定義的函數列表。 總結: ![](https://img.kancloud.cn/46/16/4616efd865f85cc32fdf643550c747e3_1080x721.png)
                  <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>

                              哎呀哎呀视频在线观看