亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Golang 內存模型詳解(一)

2020-04-01 19:25:51
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Golang 內存模型詳解(一),本文講解了Go內存模型interface、,需要的朋友可以參考下
 

開始之前

首先,這是一篇菜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;
};

 

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

Golang 內存模型詳解(一)

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久香蕉国产线看观看亚洲| 亚洲最大激情中文字幕| 91po在线观看91精品国产性色| 欧美成人性色生活仑片| 日本精品性网站在线观看| 欧美激情亚洲另类| 欧美一级高清免费| 久久久精品久久| 欧美黑人极品猛少妇色xxxxx| 另类色图亚洲色图| 亚洲国产精品悠悠久久琪琪| 成人激情视频免费在线| 国产在线拍揄自揄视频不卡99| 亚洲成人久久网| 国产精品久久一区主播| 少妇高潮 亚洲精品| 亚洲人成电影网站色| 91大神在线播放精品| 欧美黑人国产人伦爽爽爽| 亚洲伊人久久大香线蕉av| 美女黄色丝袜一区| 国产精品美女视频网站| 俺也去精品视频在线观看| 欧美色播在线播放| 少妇久久久久久| 欧美日韩成人在线视频| 欧美性猛交xxxx乱大交极品| 色婷婷综合成人av| 久久久久久噜噜噜久久久精品| 性欧美视频videos6一9| 欧美精品日韩三级| 福利精品视频在线| 国产精品视频xxxx| 91国产在线精品| 精品国产一区二区三区四区在线观看| 中文字幕亚洲欧美日韩高清| 成人午夜在线观看| 国产精品久久久久久搜索| 欧美日韩国产综合视频在线观看中文| 亚洲欧美一区二区精品久久久| 亚洲第一精品自拍| 一区二区在线免费视频| 欧美有码在线观看| 福利一区福利二区微拍刺激| 国产精品老牛影院在线观看| 色爱精品视频一区| 91精品视频网站| 国产成人精品在线观看| 97在线免费观看| 国产精品久久久久久久天堂| 欧美激情一区二区三区高清视频| 黄色91在线观看| 色在人av网站天堂精品| 久久久久久高潮国产精品视| 欧美性生活大片免费观看网址| 欧美午夜激情视频| 中文字幕亚洲无线码在线一区| 2021久久精品国产99国产精品| 国产精品视频区| 日韩高清欧美高清| 欧美丝袜第一区| 欧美影院在线播放| 8090成年在线看片午夜| 国产精品www网站| 欧美亚洲国产日本| 亚州成人av在线| 成人激情视频在线播放| 欧美国产极速在线| 色偷偷91综合久久噜噜| 欧美日韩国产影院| 色妞在线综合亚洲欧美| 一区二区三区无码高清视频| 国产精品久久久久av| 国产成人福利夜色影视| 久久亚洲精品一区| 成人福利视频网| 亚洲中国色老太| 久久免费高清视频| 国产精品久久久久久久久久久新郎| 欧美久久精品一级黑人c片| 国产精品香蕉在线观看| 久久久女人电视剧免费播放下载| 日韩av一区在线| 欧美激情在线狂野欧美精品| 精品国产网站地址| 人妖精品videosex性欧美| 麻豆精品精华液| 中文字幕亚洲精品| 日韩av在线资源| 激情久久av一区av二区av三区| 国产精品福利在线观看| 色婷婷综合成人av| 茄子视频成人在线| 国产97在线亚洲| 中文字幕日韩专区| 国内精品视频一区| 91最新在线免费观看| 亚洲欧美国产精品专区久久| 97碰在线观看| 日日狠狠久久偷偷四色综合免费| 久久综合电影一区| 亚洲区在线播放| 国产美女久久精品香蕉69| 欧美又大粗又爽又黄大片视频| 欧美日韩中文字幕在线视频| 精品成人69xx.xyz| 国产精品海角社区在线观看| 欧美另类极品videosbestfree| 亚洲美女在线视频| 78m国产成人精品视频| 久久精品国产一区二区三区| 69视频在线播放| 日韩精品福利网站| 国产成人精品免费视频| 国产999在线观看| 亚洲精品日韩欧美| 亚洲精品欧美一区二区三区| 91成人免费观看网站| 亚洲综合中文字幕68页| 国产日韩在线视频| 国产精品极品美女在线观看免费| 国内精品视频在线| 国产美女直播视频一区| 日韩欧美有码在线| 久久视频免费在线播放| 欧美激情综合色综合啪啪五月| 黄色精品在线看| 久久青草精品视频免费观看| 国产乱肥老妇国产一区二| 日韩在线观看免费全| 国产美女精品视频免费观看| 亚洲人成电影在线| 亚洲欧洲第一视频| 亚洲视频欧美视频| 久久国产色av| 日韩欧美aaa| 国产精品尤物福利片在线观看| 欧美激情一区二区三区在线视频观看| 亚洲人成在线观看网站高清| 亚洲视屏在线播放| 激情av一区二区| 国产精品一区二区3区| 日韩av免费在线观看| 欧美有码在线观看| 久久久久久这里只有精品| 亚洲美女性生活视频| 中文在线资源观看视频网站免费不卡| 91性高湖久久久久久久久_久久99| 中文字幕亚洲欧美日韩2019| 久久成人亚洲精品| 欧美日韩国产一区二区三区| 欧美电影第一页| 亚洲精品色婷婷福利天堂| 欧美肥臀大乳一区二区免费视频| 在线一区二区日韩| 91成人国产在线观看| 97在线免费视频| 色妞久久福利网| 久久国产精品久久久久| 国产精品久久不能| 国产精品亚洲第一区| 欧美中文在线观看国产| 91高清视频在线免费观看| 亚洲综合视频1区|