golang reflect反射(一):interface接口的入門(mén)(大白話(huà))

interface:不限定類(lèi)型叫惊,只關(guān)注方法

? 這是它的優(yōu)點(diǎn)做修,因?yàn)榫幾g器在編譯時(shí)不去確定你傳的到底是什么類(lèi)型霍狰,你傳一個(gè)string,它能接收饰及,你傳一個(gè)對(duì)象struct蔗坯,它也能接收,它只有一個(gè)要求燎含,實(shí)現(xiàn)我要求實(shí)現(xiàn)的方法宾濒!

? 既然interface是不限定類(lèi)型,是通用類(lèi)型瘫镇,這是一種開(kāi)放表現(xiàn)鼎兽,這種開(kāi)放怎么實(shí)現(xiàn)的呢?方法就是不去檢驗(yàn)?zāi)愕念?lèi)型铣除,既然不檢驗(yàn)?zāi)且膊蝗ビ涗浤愕念?lèi)型Q枰А!I姓场择卦!注意interface不記錄你的類(lèi)型,所以不管你是string郎嫁,struct秉继,int,我都不管泽铛,我都不記錄尚辑,我只記錄你的地址,結(jié)果是編譯器在編譯時(shí)也不知道你是什么類(lèi)型盔腔,你有什么字段杠茬!

? 但是現(xiàn)在有一個(gè)問(wèn)題,編譯器也沒(méi)辦法確定一個(gè)interface以前是什么類(lèi)型3谒妗(編譯時(shí))這就是因果關(guān)系:為了達(dá)到通用瓢喉,interface不做確定工作,結(jié)果就是interface也不知道以前的類(lèi)型舀透。

? 一個(gè)類(lèi)型轉(zhuǎn)接口的過(guò)程栓票,就是放棄自我類(lèi)型的過(guò)程,變成了沒(méi)有類(lèi)型愕够。

優(yōu)點(diǎn)

這樣做有什么好處呢走贪,很顯然是:通用佛猛,如果把一個(gè)函數(shù)的傳入?yún)?shù)設(shè)置為空接口(interface{}),那么任何類(lèi)型當(dāng)做參數(shù)都能夠調(diào)用該接口厉斟,最好的例子就是:

fmt.println(i interface{})

它就是一個(gè)很標(biāo)準(zhǔn)的例子挚躯,println傳入?yún)?shù)可以是任何類(lèi)型,都能打印出它的值擦秽。

當(dāng)一個(gè)類(lèi)型轉(zhuǎn)換成interface以后码荔,怎么確定它原來(lái)的類(lèi)型?

? 當(dāng)然你可以說(shuō)你記得感挥,因?yàn)槭悄惆阉D(zhuǎn)換成interface缩搅,你理所當(dāng)然的記得,可編譯器不知道啊触幼,interface不包含類(lèi)型硼瓣,也就是說(shuō)你沒(méi)有讓它去記錄,所以它不知道置谦。

? 針對(duì)這個(gè)問(wèn)題堂鲤,go語(yǔ)言給了一個(gè)解決方案,斷言媒峡,當(dāng)將一個(gè)interface轉(zhuǎn)換成它原來(lái)類(lèi)型的時(shí)候瘟栖,在它后面指明它的原來(lái)類(lèi)型,這樣編譯器就知道該按照什么類(lèi)型去解析了谅阿。(其實(shí)說(shuō)白了半哟,這就是通過(guò)人的記憶,編譯器不知道是什么類(lèi)型签餐,你告訴編譯器就可以了)

? 斷言其實(shí)是先獲取interface的動(dòng)態(tài)類(lèi)型寓涨,然后與你指定的類(lèi)型做判斷,如果一致氯檐,將它轉(zhuǎn)換成你指定的類(lèi)型戒良。如果不知道動(dòng)態(tài)類(lèi)型,可以看這篇文章:https://segmentfault.com/a/1190000012372372

不加斷言

    // string type
    var s string= "sss"

    // interface type
    var a interface{}
    a = s

    //convert to string
    var ss string
    ss = a    // 不加斷言
    fmt.Println(ss)


# command-line-arguments
.\exe_time.go:18:5: cannot use a (type interface {}) as type string in assignment: need type assertion

從報(bào)錯(cuò)可以看出冠摄, 不能直接轉(zhuǎn)換糯崎,需要對(duì)接口先進(jìn)行斷言

ss = a.(string)

如何對(duì)interface內(nèi)的數(shù)據(jù)進(jìn)行修改

? 通常情況下,一個(gè)變量在確定類(lèi)型的情況下編譯器知道他有哪些功能(注意耗拓,這里是針對(duì)編譯時(shí))拇颅,比如一個(gè)int類(lèi)型奏司,編譯器在編譯時(shí)知道能對(duì)他加減int乔询,不能加減float,如果你這么做我就給你報(bào)錯(cuò)韵洋。一個(gè)struct包含哪些字段竿刁,不包含哪些字段黄锤,我定義一個(gè)user結(jié)構(gòu)體,里面只有name和age兩個(gè)字段食拜,那么你只能取我這兩字段的值鸵熟,你如果取height,我就給你報(bào)錯(cuò)负甸。

? 這些都是正常情況下的流强,但是對(duì)于一個(gè)接口呢,編譯器會(huì)變成瞎子呻待!在編譯的時(shí)候它不知道你原來(lái)是什么類(lèi)型打月,所以它也沒(méi)法確定你包含什么字段,同樣是之前那個(gè)user結(jié)構(gòu)體蚕捉,當(dāng)把它轉(zhuǎn)換成接口以后奏篙,編譯器就對(duì)它的類(lèi)型一無(wú)所知了,你獲取name字段迫淹,這有接口有沒(méi)有呢秘通?編譯器不知道!你請(qǐng)求height字段敛熬,這個(gè)泛型有沒(méi)有呢肺稀?編譯器仍然不知道。所以你編譯時(shí)不能修改接口里的數(shù)據(jù)荸型,既然編譯時(shí) 不能修改盹靴,那就只能在運(yùn)行時(shí)修改了。

? 這個(gè)時(shí)候就該反射登場(chǎng)了瑞妇,它能夠在運(yùn)行時(shí)修改接口的數(shù)據(jù)稿静,通過(guò)追根溯源,獲取接口底層的實(shí)際數(shù)據(jù)和類(lèi)型辕狰,讓你能夠?qū)涌诘脑磾?shù)據(jù)進(jìn)行操作改备。

? 換一種大白話(huà)的說(shuō)法,反射就是刨根問(wèn)底蔓倍,獲取這個(gè)接口究竟是怎么產(chǎn)生的悬钳,因?yàn)槟呐乱粋€(gè)類(lèi)型轉(zhuǎn)變成接口時(shí)放棄了自己的類(lèi)型,但是它的本質(zhì)不會(huì)變的偶翅,就像趙本山的小品里所說(shuō):小樣默勾,別以為你脫掉馬甲我就不認(rèn)識(shí)你了!對(duì)聚谁,它的底層里仍然存儲(chǔ)了它的數(shù)據(jù)類(lèi)型母剥,只是藏的比較深,一般手段拿不到,但我們?nèi)匀荒軌蛲ㄟ^(guò)反射(這個(gè)包根問(wèn)底的工具)來(lái)確定你究竟包含哪些字段和值环疼,確定你究竟是蛇還是脫了馬甲的烏龜习霹!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市炫隶,隨后出現(xiàn)的幾起案子淋叶,更是在濱河造成了極大的恐慌,老刑警劉巖伪阶,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煞檩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡栅贴,警方通過(guò)查閱死者的電腦和手機(jī)形娇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)筹误,“玉大人桐早,你說(shuō)我怎么就攤上這事〕簦” “怎么了哄酝?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)祷膳。 經(jīng)常有香客問(wèn)我陶衅,道長(zhǎng),這世上最難降的妖魔是什么直晨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任搀军,我火速辦了婚禮,結(jié)果婚禮上勇皇,老公的妹妹穿的比我還像新娘罩句。我一直安慰自己,他們只是感情好敛摘,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布门烂。 她就那樣靜靜地躺著,像睡著了一般兄淫。 火紅的嫁衣襯著肌膚如雪屯远。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天捕虽,我揣著相機(jī)與錄音慨丐,去河邊找鬼。 笑死泄私,一個(gè)胖子當(dāng)著我的面吹牛房揭,可吹牛的內(nèi)容都是我干的挨措。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼崩溪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了斩松?” 一聲冷哼從身側(cè)響起伶唯,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惧盹,沒(méi)想到半個(gè)月后乳幸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钧椰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年粹断,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫡霞。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓶埋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诊沪,到底是詐尸還是另有隱情养筒,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布端姚,位于F島的核電站晕粪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏渐裸。R本人自食惡果不足惜巫湘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昏鹃。 院中可真熱鬧尚氛,春花似錦、人聲如沸洞渤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)您宪。三九已至奈懒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宪巨,已是汗流浹背磷杏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捏卓,地道東北人极祸。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓慈格,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親遥金。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浴捆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 深入理解Class對(duì)象 RRTI的概念以及Class對(duì)象作用 認(rèn)識(shí)Class對(duì)象之前,先來(lái)了解一個(gè)概念稿械,RTTI(...
    架構(gòu)師springboot閱讀 1,557評(píng)論 0 3
  • [TOC] 本文基于golang 1.11源碼進(jìn)行分析选泻。先演示用法和注意事項(xiàng),再深入源碼分析原理美莫。 在golang...
    123archu閱讀 6,643評(píng)論 5 7
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,090評(píng)論 1 32
  • 轉(zhuǎn)自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帥199207閱讀 8,504評(píng)論 3 93
  • 區(qū)塊鏈的應(yīng)用領(lǐng)域: 難處就是實(shí)現(xiàn)聯(lián)盟自治页眯,這個(gè)機(jī)制激勵(lì)的設(shè)置,各方利益的協(xié)調(diào)遠(yuǎn)比技術(shù)本身要難厢呵。關(guān)鍵的技術(shù)解耦出來(lái)窝撵,...
    食盼君閱讀 178評(píng)論 0 0