Go語言實戰筆記(七) | Go 類型

      網友投稿 656 2025-03-31

      《Go語言實戰》讀書筆記,未完待續,歡迎掃碼關注公眾號flysnow_org,第一時間看后續筆記。


      Go 語言是一種靜態類型的編程語言,所以在編譯器進行編譯的時候,就要知道每個值的類型,這樣編譯器就知道要為這個值分配多少內存,并且知道這段分配的內存表示什么。

      提前知道值的類型的好處有很多,比如編譯器可以合理的使用這些值,可以進一步優化代碼,提高執行的效率,減少bug等等。

      基本類型

      基本類型是Go語言自帶的類型,比如數值類型、浮點類型、字符類型以及布爾類型,他們本質上是原始類型,也就是不可改變的,所以對他們進行操作,一般都會返回一個新創建的值,所以把這些值傳遞給函數時,其實傳遞的是一個值的副本。

      func?main()?{ ????name:="張三" ????fmt.Println(modify(name)) ????fmt.Println(name) }func?modify(s?string)?string{ ????s=s+s????return?s }

      張三張三 張三

      以上是一個操作字符串的例子,通過打印的結果,可以看到,本來name的值并沒有被改變,也就是說,我們傳遞的時一個副本,并且返回一個新創建的字符串。

      基本類型因為是拷貝的值,并且在對他進行操作的時候,生成的也是新創建的值,所以這些類型在多線程里是安全的,我們不用擔心一個線程的修改影響了另外一個線程的數據。

      引用類型

      引用類型和原始的基本類型恰恰相反,它的修改可以影響到任何引用到它的變量。在Go語言中,引用類型有切片、map、接口、函數類型以及chan。

      引用類型之所以可以引用,是因為我們創建引用類型的變量,其實是一個標頭值,標頭值里包含一個指針,指向底層的數據結構,當我們在函數中傳遞引用類型時,其實傳遞的是這個標頭值的副本,它所指向的底層結構并沒有被復制傳遞,這也是引用類型傳遞高效的原因。

      本質上,我們可以理解函數的傳遞都是值傳遞,只不過引用類型傳遞的是一個指向底層數據的指針,所以我們在操作的時候,可以修改共享的底層數據的值,進而影響到所有引用到這個共享底層數據的變量。

      func?main()?{ ????ages?:=?map[string]int{"張三":?20} ????fmt.Println(ages) ????modify(ages) ????fmt.Println(ages) }func?modify(m?map[string]int)?{ ????m["張三"]?=?10}

      這是一個很明顯的修改引用類型的例子,函數modify的修改,會影響到原來變量ages的值。

      《Go語言實戰》筆記(七) | Go 類型

      結構類型

      結構類型是用來描述一組值的,比如一個人有身高、體重、名字和年齡等,本質上是一種聚合型的數據類型。

      type?person?struct?{ ????age?int ????name?string}

      要定義一個結構體的類型,通過type關鍵字和類型struct進行聲明,以上我們就定義了一個結構體類型person,它有age,name這兩個字段數據。

      結構體類型定義好之后,就可以進行使用了,我們可以用過var關鍵字聲明一個結構體類型的變量。

      var?p?person

      這種聲明的方式,會對結構體person里的數據類型默認初始化,也就是使用它們類型的零值,如果要創建一個結構體變量并初始化其為零值時,這種var方式最常用。

      如果我們需要指定非零值,就可以使用我們字面量方式了。

      jim?:=?person{10,"Jim"}

      示例這種我們就為其指定了值,注意這個值的順序很重要,必須和結構體里聲明字段的順序一致,當然我們也可以不按順序,但是這時候我們必須為字段指定值。

      jim?:=?person{name:"Jim",age:10}

      使用冒號:分開字段名和字段值即可,這樣我們就不用嚴格的按照定義的順序了。

      除了基本的原始類型外,結構體內的值也可以是引用類型,或者自己定義的其他類型。具體選擇類型,要根據實際情況,比如是否允許修改值本身,如果允許的話,可以選擇引用類型,如果不允許的話,則需要使用基本類型。

      函數傳參是值傳遞,所以對于結構體來說也不例外,結構體傳遞的是其本身以及里面的值的拷貝。

      func?main()?{ ????jim?:=?person{10,"Jim"} ????fmt.Println(jim) ????modify(jim) ????fmt.Println(jim) }func?modify(p?person)?{ ????p.age?=p.age+10}type?person?struct?{ ????age?int ????name?string}

      以上示例的輸出是一樣的,所以我們可以驗證傳遞的是值的副本。如果上面的例子我們要修改age的值可以通過傳遞結構體的指針,我們稍微改動下例子

      func?main()?{ ????jim?:=?person{10,"Jim"} ????fmt.Println(jim) ????modify(&jim) ????fmt.Println(jim) }func?modify(p?*person)?{ ????p.age?=p.age+10}type?person?struct?{ ????age?int ????name?string}

      這個例子的輸出是

      {10?Jim} {20?Jim}

      非常明顯的,age的值已經被改變。如果結構體里有引用類型的值,比如map,那么我們即使傳遞的是結構體的值副本,如果修改這個map的話,原結構的對應的map值也會被修改,這里不再寫例子,大家可以驗證下。

      自定義類型

      Go語言支持我們自定義類型,比如剛剛上面的結構體類型,就是我們自定義的類型,這也是比較常用的自定義類型的方法。

      另外一個自定義類型的方法是基于一個已有的類型,就是基于一個現有的類型創造新的類型,這種也是使用type關鍵字。

      type?Duration?int64

      我們在使用time這個包的時候,對于類型time.Duration應該非常熟悉,它其實就是基于int64?這個基本類型創建的新類型,來表示時間的間隔。

      但是這里我們注意,雖然Duration是基于int64創建,覺得他們其實一樣,比如都可以使用數字賦值。

      type?Duration?int64var?i?Duration?=?100var?j?int64?=?100

      但是本質上,他們并不是同一種類型,所以對于Go這種強類型語言,他們是不能相互賦值的。

      type?Duration?int64var?dur?Duration dur=int64(100) fmt.Println(dur)

      上面的例子,在編譯的時候,會報類型轉換的異常錯誤。

      cannot?use?int64(100)?(type?int64)?as?type?Duration?in?assignment

      Go的編譯器不會像Java的那樣,幫我們做隱式的類型轉換。

      有時候,大家會迷茫,已經有了int64這些類型了,可以表示,還要基于他們創建新的類型做什么?其實這就是Go靈活的地方,我們可以使用自定義的類型做很多事情,比如添加方法,比如可以更明確的表示業務的含義等等,下一篇方法我們會講到。

      《Go語言實戰》讀書筆記,未完待續,歡迎掃碼關注公眾號flysnow_org,第一時間看后續筆記。

      本文轉載自異步社區

      軟件開發

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:點了插入流程圖到文檔但沒有顯示(流程圖里文字不顯示)
      下一篇:wps表格怎么添加圖表(wps如何添加圖表)
      相關文章
      亚洲午夜久久久久久久久久 | 亚洲欧洲日产国产综合网| 一区国严二区亚洲三区| 中文字幕在线观看亚洲日韩| 亚洲特级aaaaaa毛片| 亚洲视频网站在线观看| 激情内射亚洲一区二区三区| 婷婷亚洲久悠悠色悠在线播放| 国产成人精品日本亚洲| 亚洲动漫精品无码av天堂| 亚洲美女又黄又爽在线观看| 国产AV无码专区亚洲AVJULIA| 国产亚洲精品精华液| 亚洲国产精品无码中文字| 亚洲成色在线综合网站| 亚洲v高清理论电影| 亚洲天堂中文资源| 亚洲理论片在线中文字幕| 亚洲白色白色永久观看| 亚洲a级成人片在线观看| 456亚洲人成在线播放网站| 亚洲午夜福利在线视频| 久久久久亚洲AV无码去区首| 国产区图片区小说区亚洲区| 亚洲午夜无码片在线观看影院猛 | 国产亚洲男人的天堂在线观看 | 亚洲精品视频久久久| 国产亚洲精品久久久久秋霞| 亚洲精品国产字幕久久不卡| 亚洲av午夜福利精品一区人妖| 亚洲AV日韩精品久久久久久 | 亚洲av午夜精品一区二区三区 | 亚洲a∨无码男人的天堂| 亚洲综合一区国产精品| 久久亚洲AV成人无码国产最大| 亚洲av日韩片在线观看| 伊伊人成亚洲综合人网7777| 亚洲国产一区在线| 亚洲中文无码a∨在线观看| 亚洲日韩AV无码一区二区三区人| 朝桐光亚洲专区在线中文字幕 |