好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Golang 內存模型詳解(一)

Golang 內存模型詳解(一)

熱門標簽:工商信用卡外呼系統教程 客服級電銷機器人 滁州自建外呼系統 經常接到推銷電話機器人的電話 外呼系統多少錢一年 智能營銷軟件 海外照相館地圖標注入駐 外呼系統如何接收服務密碼 旅游廁所如何電子地圖標注

開始之前

首先,這是一篇菜B寫的文章,可能會有理解錯誤的地方,發現錯誤請斧正,謝謝。

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

此 nil 不等彼 nil

先聲明,這個標題有標題黨的嫌疑。

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

復制代碼 代碼如下:

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,對于沒有用過 Go 的人來說比較費解,對我來說,這個算得上一門語言設計有歧義的地方(Golang FAQ 有對于此問題的描述,可以參考一下:http://golang.org/doc/faq#nil_error)。

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

碰到了這個坑,我就開始好奇了,Go 的類型系統到底是什么樣的?

Go 內存模型 - interface

概述

為了讀懂下面的內容,你需要:

了解 C、Go 語言

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

PS: 由于 Go 用到了 Plan9 C 這個小眾的C編譯器的擴展,比如在函數簽名中使用 · 字符以區分 package/function(比如runtime·panic),這對理解不會產生什么影響。

PSS: 對于 Go runtime,可以參考src/pkg/reflect(reflect包)中的的代碼,對類型系統的實現的理解有幫助。

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

1.runtime.h
2.type.h

對于 interface 類型,主要看下面幾個結構體定義:

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

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

InterfaceType:

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

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

復制代碼 代碼如下:

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

Itab:

類似于虛函數表,該表不會被GC回收,其中:

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

復制代碼 代碼如下:

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

Iface:

該類型為一般的 interface 類型所對應的數據結構,其中:

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

復制代碼 代碼如下:

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

Eface:

該類型為 interface{} (empty interface) 所對應的數據結構,其中:

1.type: 具體實現類型, 也即 receiver type
2.data: 同 Iface

復制代碼 代碼如下:

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

他們的依賴關系如下圖所示:

先到這里,下一篇將會舉例子說明給一個 interface{} 類型的變量賦值后,其具體的內存結構是怎么樣的。

打了幾個小時,真費時間,爭取這個系列不坑 (逃

您可能感興趣的文章:
  • django數據關系一對多、多對多模型、自關聯的建立
  • django的ORM模型的實現原理
  • 解決golang內存溢出的方法
  • 解決MongoDB 排序超過內存限制的問題
  • 詳解Go內存模型

標簽:楚雄 運城 九江 深圳 晉城 湘潭 喀什 本溪

巨人網絡通訊聲明:本文標題《Golang 內存模型詳解(一)》,本文關鍵詞  Golang,內存,模型,詳解,一,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang 內存模型詳解(一)》相關的同類信息!
  • 本頁收集關于Golang 內存模型詳解(一)的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 国产91精品人妻一区二区三| 小妾h| 美女脱全身内衣火辣| 69凹凸国产成人精品视频| videossex变态狂另类| 娇妻被老外高H系列小说| 女的被?到爽的A片动态图| 级三片| 男女拍拍拍无挡免费视频| 成人精品网站永久在线观看免费| 911在线无码精品秘?蜜桃| 亚洲人成7777影视在线观看| 美女把腿扒开让男人桶爽| 国产乡下妇女做爰毛片村妓| 亚洲综合精品香蕉久久网97| 91在线精品无码秘?入口| 波多野结衣办公室33分jian情| 亚洲AV无码秘?蜜桃粉股| 纲手被?吸乳羞羞漫画网站| 稚嫩玉茎初尝禁果| 国产一区二区在线看| 国产精品秘?精东传媒 | 成人不卡在线| 两个人的视频在线观看免费完整版 | 8x8ⅹ拨牐拨牐拨牐永久免费| 日本人善交69xxx| 国产精品无码制服丝袜| 国产精品高清全国免费观看| www久久日本无码夜色| 国产CD系列TS紫苑慰菊| 在线观看成人免费视频播放| 情侣莲花坐姿图片高清大图大全| 刮伦真实情况| 爱丫爱丫在线影院电视剧免费动漫 | 美国伦理| 成人综合在线视频| 97国产精品无码免费视频蝌蚪网| 欧美精品色情特级A片教室别恋| 亚洲欧洲一二三区机械有限公司| 好男人影视在线WWW官网| H动漫精品3D动漫3D动漫在线|