『No12: Go 值語義和引用語義』

go-12.png
12-1.png

大家好闸昨,我叫謝偉蚯斯,是一名程序員。

如何你想要尋找一份和編程相關(guān)的職位饵较,經(jīng)驗(yàn)不太夠的話拍嵌,面試官會(huì)考察你什么?

  • 基礎(chǔ)循诉,比如你對某編程語言的理解程度
  • 學(xué)習(xí)能力横辆,即如何展現(xiàn)你的學(xué)習(xí)能力

本節(jié)的主題,Go 語言中的:值語義和引用語義

問題列表:

  • 值語義和引用語義的區(qū)別是什么茄猫?
  • 內(nèi)置的類型哪些是值語義狈蚤,哪些是引用語義?
  • make 和 new 有什么區(qū)別划纽?

值語義和引用語義

Go 語言中的大多數(shù)類型都是值語義脆侮。值語義和引用的區(qū)別在于賦值之后,重新賦值勇劣,是否會(huì)改變原值靖避。

如果不改變原值,則是值語義。否則是引用語義筋蓖,引用語義比值語義擁有更復(fù)雜的存儲(chǔ)結(jié)構(gòu)卸耘。比如分配內(nèi)存、指針粘咖、長度蚣抗、容量等。

package main

import "fmt"

func main() {

    // map瓮下、slice翰铡、channel

    var number int

    number = 0
    copyNumber := number
    copyNumber = 3

    fmt.Printf("----: new=%v, old=%v\n", copyNumber, number)

    var List = [2]int{1, 2}

    copyList := List
    copyList[1] = 4

    fmt.Printf("----: new=%v, old=%v\n", copyList, List)

    type Info struct {
        Name   string
        Age    int
        School string
    }

    oldInfo := Info{
        "xieWei", 20, "shanghaiUniversity",
    }

    newInfo := oldInfo
    newInfo.Name = "xieWei2"

    fmt.Printf("----: new=%v, old=%v\n", newInfo, oldInfo)

    var Body = make(map[string]string)
    Body["name"] = "xieWei"
    Body["School"] = "shanghaiUniversity"

    newBody := Body
    newBody["name"] = "xieWei2"
    newBody["Age"] = "20"

    fmt.Printf("----: new=%v, old=%v\n", newBody, Body)

    var oldSlice = []int{1, 2, 3, 4}

    newSlice := oldSlice
    newSlice[3] = 10
    newSlice = append(newSlice, 100)

    fmt.Printf("----: new=%v, old=%v\n", newSlice, oldSlice)

}

結(jié)果:

----: new=3, old=0
----: new=[1 4], old=[1 2]
----: new={xieWei2 20 shanghaiUniversity}, old={xieWei 20 shanghaiUniversity}
----: new=map[name:xieWei2 School:shanghaiUniversity Age:20], old=map[name:xieWei2 School:shanghaiUniversity Age:20]
----: new=[1 2 3 10 100], old=[1 2 3 10]

結(jié)論:

  • 在 Go 語言中值語義和引用語義的區(qū)別發(fā)生在賦值語句中。map讽坏、slice锭魔、channel 這三種類型

  • 賦值之后,修改新的對象路呜,會(huì)改變原對象的內(nèi)容迷捧,是因?yàn)橐谜Z義底層都指向的是地址

  • 引用類型必須使用 make 函數(shù)創(chuàng)建,完成內(nèi)存分配和相關(guān)屬性的初始化胀葱。即:對應(yīng)的值上都有初始化值漠秋,比如 int 類型,則初始化值為0抵屿, 比如 string 類型庆锦,則初始化為空,諸如此類

package main

func main(){
    var exampleSlice = make([]int, 4)
    exampleSlice[0] = 1
    fmt.Println(exampleSlice)
}

結(jié)果:

[1 0 0 0]

只賦值第一個(gè)元素轧葛,其他元素默為0搂抒。

值語義的數(shù)據(jù),想要改變元素值尿扯,需要使用指針:

    var exampleInt int

    exampleInt = 4

    newExampleInt := &exampleInt
    *newExampleInt = 40

    fmt.Println(exampleInt, *newExampleInt)

結(jié)果:

40 40

內(nèi)置函數(shù) new 按指定類型分配零值內(nèi)存求晶, 返回的是一個(gè)指針。

    type Info struct {
        Name   string
        Age    int
        School string
    }

    exampleBigInfo := new(Info)
    fmt.Println(exampleBigInfo)

結(jié)果:

&{ 0 }

可以看出:

  • 返回指針
  • 存在零值衷笋,比如 Name 為 '', Age 為0誉帅,School 為 ''.

本節(jié)這樣,再會(huì)右莱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚜锨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子慢蜓,更是在濱河造成了極大的恐慌亚再,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晨抡,死亡現(xiàn)場離奇詭異氛悬,居然都是意外死亡则剃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門如捅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棍现,“玉大人,你說我怎么就攤上這事镜遣〖喊梗” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵悲关,是天一觀的道長谎僻。 經(jīng)常有香客問我,道長寓辱,這世上最難降的妖魔是什么艘绍? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮秫筏,結(jié)果婚禮上诱鞠,老公的妹妹穿的比我還像新娘。我一直安慰自己这敬,他們只是感情好航夺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鹅颊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪墓造。 梳的紋絲不亂的頭發(fā)上堪伍,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機(jī)與錄音觅闽,去河邊找鬼帝雇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蛉拙,可吹牛的內(nèi)容都是我干的尸闸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼孕锄,長吁一口氣:“原來是場噩夢啊……” “哼吮廉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起畸肆,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宦芦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后轴脐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體调卑,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抡砂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恬涧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片注益。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖溯捆,靈堂內(nèi)的尸體忽然破棺而出丑搔,到底是詐尸還是另有隱情,我是刑警寧澤现使,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布低匙,位于F島的核電站,受9級特大地震影響碳锈,放射性物質(zhì)發(fā)生泄漏顽冶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一售碳、第九天 我趴在偏房一處隱蔽的房頂上張望强重。 院中可真熱鬧,春花似錦贸人、人聲如沸间景。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倘要。三九已至,卻和暖如春十拣,著一層夾襖步出監(jiān)牢的瞬間封拧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工夭问, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泽西,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓缰趋,卻偏偏與公主長得像捧杉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子秘血,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

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