最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang 內(nèi)存模型詳解(一)

 更新時(shí)間:2014年10月27日 11:57:16   投稿:junjie  
這篇文章主要介紹了Golang 內(nèi)存模型詳解(一),本文講解了Go內(nèi)存模型interface、,需要的朋友可以參考下

開始之前

首先,這是一篇菜B寫的文章,可能會(huì)有理解錯(cuò)誤的地方,發(fā)現(xiàn)錯(cuò)誤請(qǐng)斧正,謝謝。

為了治療我的懶癌早期,我一次就不寫得太多了,這個(gè)系列想寫很久了,每次都是開了個(gè)頭就沒有再寫。這次爭取把寫完,弄成一個(gè)系列。

此 nil 不等彼 nil

先聲明,這個(gè)標(biāo)題有標(biāo)題黨的嫌疑。

Go 的類型系統(tǒng)是比較奇葩的,nil 的含義跟其它語言有些差別,這里舉個(gè)例子(可以直接進(jìn)入 http://play.golang.org/p/ezFhXX0dnB 運(yùn)行查看結(jié)果):

復(fù)制代碼 代碼如下:

package main
import "fmt"
type A struct {
}
func main() {
    var a *A = nil
    var ai interface{} = a
    var ei interface{} = nil
    fmt.Printf("ai == nil: %v\n", ai == nil)
    fmt.Printf("ai == ei: %v\n", ai == ei)
    fmt.Printf("ei == a: %v\n", a == ei)
    fmt.Printf("ei == nil: %v\n", ei == nil)
}
// -> 輸出
// ai == nil: false
// ai == ei: false
// ei == a: false
// ei == nil: true

這里 ai != nil,對(duì)于沒有用過 Go 的人來說比較費(fèi)解,對(duì)我來說,這個(gè)算得上一門語言設(shè)計(jì)有歧義的地方(Golang FAQ 有對(duì)于此問題的描述,可以參考一下:http://golang.org/doc/faq#nil_error)。

簡單的說就是 nil 代表 “zero value”(空值),對(duì)于不同類型,它具體所代表的值不同。比如上面的 a 為“*A 類型的空值”,而 ai 為“interface{} 類型的空值”。造成理解失誤的最大問題在于,struct pointer 到 interface 有隱式轉(zhuǎn)換(var ai interface{] = a,這里有個(gè)隱式轉(zhuǎn)換),至于為什么對(duì)于 Go 這種在其它轉(zhuǎn)換方面要求嚴(yán)格,而對(duì)于 interface 要除外呢,for convenience 吧,呵呵……

碰到了這個(gè)坑,我就開始好奇了,Go 的類型系統(tǒng)到底是什么樣的?

Go 內(nèi)存模型 - interface

概述

為了讀懂下面的內(nèi)容,你需要:

了解 C、Go 語言

Go 1.3 源代碼 (https://go.googlecode.com/archive/go1.3.zip)

PS: 由于 Go 用到了 Plan9 C 這個(gè)小眾的C編譯器的擴(kuò)展,比如在函數(shù)簽名中使用 · 字符以區(qū)分 package/function(比如runtime·panic),這對(duì)理解不會(huì)產(chǎn)生什么影響。

PSS: 對(duì)于 Go runtime,可以參考src/pkg/reflect(reflect包)中的的代碼,對(duì)類型系統(tǒng)的實(shí)現(xiàn)的理解有幫助。

Go 語言的類型定義可以在 src/pkg/runtime/ 目錄下找到,主要由以下幾個(gè)文件構(gòu)成:

1.runtime.h
2.type.h

對(duì)于 interface 類型,主要看下面幾個(gè)結(jié)構(gòu)體定義:

1.InterfaceType
2.Itab
3.Iface
4.Eface

它們的C語言定義如下 (可以在 runtime.h 中找到):

InterfaceType:

代表了總的 interface 類型,其中:

1.Type: 類型描述,所有的類型都有這個(gè)類型描述(比如 array, map, slice)
2.mhdr 以及 m: interface 接口方法列表

復(fù)制代碼 代碼如下:

struct InterfaceType
{
    Type;
    Slice mhdr;
    IMethod m[];
};

Itab:

類似于虛函數(shù)表,該表不會(huì)被GC回收,其中:

1.inter: 指向具體的 interface 類型
2.type: 具體實(shí)現(xiàn)類型, 也即 receiver type
3.link: 指向下一個(gè)函數(shù)表,因?yàn)?interface 可以 embed 多個(gè) interface,因此實(shí)現(xiàn)為一個(gè)鏈表形式
4.bad: <略>
5.unsued: <略>
6.fun: 函數(shù)列表,每個(gè)元素是一個(gè)指向具體函數(shù)實(shí)現(xiàn)的指針

復(fù)制代碼 代碼如下:

struct  Itab
{
    InterfaceType*  inter;
    Type*   type;
    Itab*   link;
    int32   bad;
    int32   unused;
    void    (*fun[])(void);
};

Iface:

該類型為一般的 interface 類型所對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu),其中:

1.tab: 參見 Itab 的說明,尤其是 Itab::link
2.data: 指向具體數(shù)據(jù)(比如指向struct,當(dāng)然,如果一個(gè)數(shù)據(jù)不超過一個(gè)字長,那么這個(gè)data就可以直接存放,不需要指針再做以及跳轉(zhuǎn))

復(fù)制代碼 代碼如下:

struct Iface
{
    Itab*   tab;
    void*   data;
};

Eface:

該類型為 interface{} (empty interface) 所對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu),其中:

1.type: 具體實(shí)現(xiàn)類型, 也即 receiver type
2.data: 同 Iface

復(fù)制代碼 代碼如下:

struct Eface
{
    Type*   type;
    void*   data;
};

他們的依賴關(guān)系如下圖所示:

先到這里,下一篇將會(huì)舉例子說明給一個(gè) interface{} 類型的變量賦值后,其具體的內(nèi)存結(jié)構(gòu)是怎么樣的。

打了幾個(gè)小時(shí),真費(fèi)時(shí)間,爭取這個(gè)系列不坑 (逃

相關(guān)文章

  • Go?gRPC教程實(shí)現(xiàn)Simple?RPC

    Go?gRPC教程實(shí)現(xiàn)Simple?RPC

    這篇文章主要為大家介紹了Go?gRPC教程實(shí)現(xiàn)Simple?RPC示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go 實(shí)現(xiàn)百萬WebSocket連接的方法示例

    Go 實(shí)現(xiàn)百萬WebSocket連接的方法示例

    這篇文章主要介紹了Go 實(shí)現(xiàn)百萬WebSocket連接的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Go基礎(chǔ)教程系列之?dāng)?shù)據(jù)類型詳細(xì)說明

    Go基礎(chǔ)教程系列之?dāng)?shù)據(jù)類型詳細(xì)說明

    這篇文章主要介紹了Go基礎(chǔ)教程系列之?dāng)?shù)據(jù)類型詳細(xì)說明,需要的朋友可以參考下
    2022-04-04
  • Go在GoLand中引用github.com中的第三方包具體步驟

    Go在GoLand中引用github.com中的第三方包具體步驟

    這篇文章主要給大家介紹了關(guān)于Go在GoLand中引用github.com中第三方包的具體步驟,文中通過圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Go具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-01-01
  • go MethodByName()不能獲取私有方法的解決

    go MethodByName()不能獲取私有方法的解決

    本文主要介紹了go MethodByName()不能獲取私有方法的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 使用Go語言進(jìn)行條件編譯的示例代碼

    使用Go語言進(jìn)行條件編譯的示例代碼

    Go的條件編譯主要通過構(gòu)建標(biāo)簽(build?tags)和構(gòu)建約束(build?constraints)來實(shí)現(xiàn),這些標(biāo)簽和約束可以讓我們針對(duì)不同的操作系統(tǒng)、架構(gòu)或特定條件編寫特定代碼,本文給大家介紹了如何使用Go語言進(jìn)行條件編譯,需要的朋友可以參考下
    2024-06-06
  • 使用go gin來操作cookie的講解

    使用go gin來操作cookie的講解

    今天小編就為大家分享一篇關(guān)于使用go gin來操作cookie的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Golang?sync.Once實(shí)現(xiàn)單例模式的方法詳解

    Golang?sync.Once實(shí)現(xiàn)單例模式的方法詳解

    Go?語言的?sync?包提供了一系列同步原語,其中?sync.Once?就是其中之一。本文將深入探討?sync.Once?的實(shí)現(xiàn)原理和使用方法,幫助大家更好地理解和應(yīng)用?sync.Once,需要的可以參考一下
    2023-05-05
  • go語言區(qū)塊鏈實(shí)戰(zhàn)實(shí)現(xiàn)簡單的區(qū)塊與區(qū)塊鏈

    go語言區(qū)塊鏈實(shí)戰(zhàn)實(shí)現(xiàn)簡單的區(qū)塊與區(qū)塊鏈

    這篇文章主要為大家介紹了go語言區(qū)塊鏈的實(shí)戰(zhàn)學(xué)習(xí),來實(shí)現(xiàn)簡單的區(qū)塊與區(qū)塊鏈?zhǔn)纠^程,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • 利用golang實(shí)現(xiàn)封裝trycatch異常處理實(shí)例代碼

    利用golang實(shí)現(xiàn)封裝trycatch異常處理實(shí)例代碼

    Go語言追求簡潔優(yōu)雅,所以go語言不支持傳統(tǒng)的 try…catch…finally 這種異常,最近發(fā)現(xiàn)了不錯(cuò)的trycatch包,下面這篇文章主要跟大家分享了關(guān)于利用golang實(shí)現(xiàn)封裝trycatch異常處理的實(shí)例代碼,需要的朋友可以參考下。
    2017-07-07

最新評(píng)論

峨眉山市| 磐安县| 璧山县| 日照市| 奈曼旗| 文安县| 虎林市| 阜新| 资溪县| 松滋市| 阿巴嘎旗| 安阳市| 武义县| 潜江市| 盐城市| 黔江区| 成都市| 赣榆县| 洛浦县| 原平市| 岑溪市| 女性| 开化县| 化德县| 普兰店市| 城口县| 陕西省| 曲靖市| 朝阳区| 峨山| 城市| 桐梓县| 扎兰屯市| 颍上县| 芦溪县| 罗山县| 萍乡市| 宝应县| 淳安县| 天峻县| 孟津县|