国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Golang - Go語言中復(fù)合數(shù)據(jù)類型:字典 Map 和 結(jié)構(gòu)體 Struct

Go語言中復(fù)合數(shù)據(jù)類型:字典 Map 和 結(jié)構(gòu)體 Struct

2021-08-02 22:30AlwaysBetayongxinz Golang

本文介紹了Go語言中字典和結(jié)構(gòu)體,兩種很常用的數(shù)據(jù)類型。雖然篇幅不長,但基本操作也都包括,寫代碼肯定是沒有問題的。更底層的原理和更靈活的用法就需要大家自己去探索和發(fā)現(xiàn)了。

Go語言中復(fù)合數(shù)據(jù)類型:字典 Map 和 結(jié)構(gòu)體 Struct

樓下新開了一家重慶砂鍋肥腸,擴(kuò)音喇叭一直在放:正宗的老重慶砂鍋肥腸,麻辣可口,老巴適了。

正不正宗不知道,反正聽口音,我以為我回東北了。

本篇介紹復(fù)合數(shù)據(jù)類型的最后一篇:字典和結(jié)構(gòu)體。內(nèi)容很重要,編程時(shí)用的也多,需要熟練掌握才行。

本文所有代碼基于 go1.16.6 編寫。

字典

 

字典是一種非常常用的數(shù)據(jù)結(jié)構(gòu),Go 中用關(guān)鍵詞 map 表示,類型是 map[K]V。K 和 V 分別是字典的鍵和值的數(shù)據(jù)類型,其中鍵必須支持相等運(yùn)算符,比如數(shù)字,字符串等。

創(chuàng)建字典

有兩種方式可以創(chuàng)建字典,第一種是直接使用字面量創(chuàng)建;第二種使用內(nèi)置函數(shù) make。

字面量方式創(chuàng)建:

  1. // 字面量方式創(chuàng)建 
  2. var m = map[string]int{"a": 1, "b": 2} 
  3. fmt.Println(m) // map[a:1 b:2] 

使用 make 創(chuàng)建:

  1. // 使用 make 創(chuàng)建 
  2. m1 := make(map[string]int
  3. fmt.Println(m1) 

還可以初始化字典的長度。在已知字典長度的情況下,直接指定長度可以提升程序的執(zhí)行效率。

  1. // 指定長度 
  2. m2 := make(map[string]int, 10) 
  3. fmt.Println(m2) 

字典的零值是 nil,對值是 nil 的字典賦值會(huì)報(bào)錯(cuò)。

  1. // 零值是 nil 
  2. var m3 map[string]int 
  3. fmt.Println(m3 == nil, len(m3) == 0) // true true 
  4. // nil 賦值報(bào)錯(cuò) 
  5. // m3["a"] = 1 
  6. // fmt.Println(m3)    // panic: assignment to entry in nil map 

使用字典

賦值

  1. // 賦值 
  2. m["c"] = 3 
  3. m["d"] = 4 
  4. fmt.Println(m) // map[a:1 b:2 c:3 d:4] 

取值:

  1. // 取值 
  2. fmt.Println(m["a"], m["d"]) // 1 4 
  3. fmt.Println(m["k"])         // 0 

即使在 Key 不存在的情況下,也是不報(bào)錯(cuò)的。而是返回對應(yīng)類型的零值。

刪除元素:

  1. // 刪除 
  2. delete(m, "c"
  3. delete(m, "f") // key 不存在也不報(bào)錯(cuò) 
  4. fmt.Println(m) // map[a:1 b:2 d:4] 

獲取長度:

  1. // 獲取長度 
  2. fmt.Println(len(m)) // 3 

判斷鍵是否存在:

  1. // 判斷鍵是否存在 
  2. if value, ok := m["d"]; ok { 
  3.     fmt.Println(value) // 4 

和 Python 對比起來看,這個(gè)用起來就很爽。

遍歷:

  1. // 遍歷 
  2. for k, v := range m { 
  3.     fmt.Println(k, v) 

引用類型

map 是引用類型,所以在函數(shù)間傳遞時(shí),也不會(huì)制造一個(gè)映射的副本,這點(diǎn)和切片類似,都很高效。

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func main() { 
  6.     ... 
  7.  
  8.     // 傳參 
  9.     modify(m) 
  10.     fmt.Println("main: ", m) // main:  map[a:1 b:2 d:4 e:10] 
  11.  
  12. func modify(a map[string]int) { 
  13.     a["e"] = 10 
  14.     fmt.Println("modify: ", a) //   modify:  map[a:1 b:2 d:4 e:10] 

結(jié)構(gòu)體

 

結(jié)構(gòu)體是一種聚合類型,包含零個(gè)或多個(gè)任意類型的命名變量,每個(gè)變量叫做結(jié)構(gòu)體的成員。

創(chuàng)建結(jié)構(gòu)體

首先使用 type 來自定義一個(gè)結(jié)構(gòu)體類型 user,里面有兩個(gè)成員變量,分別是:name 和 age。

  1. // 聲明結(jié)構(gòu)體 
  2. type user struct { 
  3.     name string 
  4.     age  int 

結(jié)構(gòu)體的初始化有兩種方式:

第一種是按照聲明字段的順序逐個(gè)賦值,這里需要注意,字段的順序要嚴(yán)格一致。

  1. // 初始化 
  2. u1 := user{"zhangsan", 18} 
  3. fmt.Println(u1) // {zhangsan 18} 

這樣做的缺點(diǎn)很明顯,如果字段順便變了,那么凡是涉及到這個(gè)結(jié)構(gòu)初始化的部分都要跟著變。

所以,更推薦使用第二種方式,按照字段名字來初始化。

  1. // 更好的方式 
  2. // u := user
  3. //     age: 20, 
  4. // } 
  5. // fmt.Println(u)    // { 20} 
  6. u := user
  7.     name"zhangsan"
  8.     age:  18, 
  9. fmt.Println(u) // {zhangsan 18} 

未初始化的字段會(huì)賦值相應(yīng)類型的零值。

使用結(jié)構(gòu)體

使用點(diǎn)號(hào) . 來訪問和賦值成員變量。

  1. // 訪問結(jié)構(gòu)體成員 
  2. fmt.Println(u.name, u.age) // zhangsan 18 
  3. u.name = "lisi" 
  4. fmt.Println(u.name, u.age) // lisi 18 

如果結(jié)構(gòu)體的成員變量是可比較的,那么結(jié)構(gòu)體也是可比較的。

  1. // 結(jié)構(gòu)體比較 
  2. u2 := user
  3.     age:  18, 
  4.     name"zhangsan"
  5. fmt.Println(u1 == u)  // false 
  6. fmt.Println(u1 == u2) // true 

結(jié)構(gòu)體嵌套

現(xiàn)在我們已經(jīng)定義一個(gè) user 結(jié)構(gòu)體了,假設(shè)我們再定義兩個(gè)結(jié)構(gòu)體 admin 和 leader,如下:

  1. type admin struct { 
  2.     name    string 
  3.     age     int 
  4.     isAdmin bool 
  5.  
  6. type leader struct { 
  7.     name     string 
  8.     age      int 
  9.     isLeader bool 

那么問題就來了,有兩個(gè)字段 name 和 age 被重復(fù)定義了多次。

懶是程序員的必修課。有沒有什么辦法可以復(fù)用這兩個(gè)字段呢?答案就是結(jié)構(gòu)體嵌套。

使用嵌套方式優(yōu)化后變成了這樣:

  1. type admin struct { 
  2.     u       user 
  3.     isAdmin bool 
  4.  
  5. type leader struct { 
  6.     u        user 
  7.     isLeader bool 

代碼看起來簡潔了很多。

匿名成員

但這樣依然不是很完美,每次訪問嵌套結(jié)構(gòu)體的成員變量時(shí)還是有點(diǎn)麻煩。

  1. // 結(jié)構(gòu)體嵌套 
  2. a := admin{ 
  3.     u:       u, 
  4.     isAdmin: true
  5. fmt.Println(a) // {{lisi 18} true
  6. a.u.name = "wangwu" 
  7. fmt.Println(a.u.name)  // wangwu 
  8. fmt.Println(a.u.age)   // 18 
  9. fmt.Println(a.isAdmin) // true 

這個(gè)時(shí)候就需要匿名成員登場了,不指定名稱,只指定類型。

  1. type admin1 struct { 
  2.     user 
  3.     isAdmin bool 

通過這種方式可以省略掉中間變量,直接訪問我們需要的成員變量。

  1. // 匿名成員 
  2. a1 := admin1{ 
  3.     user:    u, 
  4.     isAdmin: true
  5. a1.age = 20 
  6. a1.isAdmin = false 
  7.  
  8. fmt.Println(a1)         // {{lisi 20} false
  9. fmt.Println(a1.name)    // lisi 
  10. fmt.Println(a1.age)     // 20 
  11. fmt.Println(a1.isAdmin) // false 

總結(jié)

 

本文介紹了字典和結(jié)構(gòu)體,兩種很常用的數(shù)據(jù)類型。雖然篇幅不長,但基本操作也都包括,寫代碼肯定是沒有問題的。更底層的原理和更靈活的用法就需要大家自己去探索和發(fā)現(xiàn)了。

當(dāng)然,我也會(huì)在寫完基礎(chǔ)專欄之后,分享一些更深層的文章,歡迎大家關(guān)注,交流。

到目前為止,數(shù)據(jù)類型就都介紹完了。

先是學(xué)習(xí)了基礎(chǔ)數(shù)據(jù)類型,包括整型,浮點(diǎn)型,復(fù)數(shù)類型,布爾型和字符串型。然后是復(fù)合數(shù)據(jù)類型,包括數(shù)組,切片,字典和結(jié)構(gòu)體。

這些都是 Go 的基礎(chǔ),一定要多多練習(xí),熟練掌握。文中的代碼我都已經(jīng)上傳到 Github 了,有需要的同學(xué)可以點(diǎn)擊文末地址,自行下載。

文章中的腦圖和源碼都上傳到了 GitHub,有需要的同學(xué)可自行下載。

原文地址:https://mp.weixin.qq.com/s/1unl6K9xHxy4V3KukORC3A

延伸 · 閱讀

精彩推薦
  • Golanggo日志系統(tǒng)logrus顯示文件和行號(hào)的操作

    go日志系統(tǒng)logrus顯示文件和行號(hào)的操作

    這篇文章主要介紹了go日志系統(tǒng)logrus顯示文件和行號(hào)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • Golanggolang的httpserver優(yōu)雅重啟方法詳解

    golang的httpserver優(yōu)雅重啟方法詳解

    這篇文章主要給大家介紹了關(guān)于golang的httpserver優(yōu)雅重啟的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,...

    helight2992020-05-14
  • GolangGolang中Bit數(shù)組的實(shí)現(xiàn)方式

    Golang中Bit數(shù)組的實(shí)現(xiàn)方式

    這篇文章主要介紹了Golang中Bit數(shù)組的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨(dú)尊11682021-06-09
  • Golanggolang如何使用struct的tag屬性的詳細(xì)介紹

    golang如何使用struct的tag屬性的詳細(xì)介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細(xì)介紹,從例子說起,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看...

    Go語言中文網(wǎng)11352020-05-21
  • Golanggolang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
  • GolangGolang通脈之?dāng)?shù)據(jù)類型詳情

    Golang通脈之?dāng)?shù)據(jù)類型詳情

    這篇文章主要介紹了Golang通脈之?dāng)?shù)據(jù)類型,在編程語言中標(biāo)識(shí)符就是定義的具有某種意義的詞,比如變量名、常量名、函數(shù)名等等,Go語言中標(biāo)識(shí)符允許由...

    4272021-11-24
主站蜘蛛池模板: 亚洲激情精品 | 天天综合视频网 | 黄色在线观看 | 荷兰欧美一级毛片 | 免费一二区| 国产免费一区 | 亚洲中字幕 | 精品无人乱码一区二区三区 | 精品美女久久久 | 国产黄色免费看 | 中文字幕亚洲欧美日韩在线不卡 | 在线免费观看激情视频 | 亚洲成人午夜电影 | 97视频在线 | 色一色网站 | 久久久久无码国产精品一区 | 国产精品福利电影网 | 玖玖操| 一级毛片视频 | 亚洲综合精品 | 国产91精品久久久久 | 日韩欧美国产一区二区三区 | 在线观看午夜免费视频 | 国产精品福利电影网 | 一区二区中文 | 亚洲狠狠爱 | 日韩精品免费一区二区三区 | 一区二区三区免费在线观看 | 精一区二区 | 在线成人av | 成人自拍视频 | 91视频免费| 亚洲激情网站 | 精品欧美一区二区三区久久久 | 激情欧美一区二区三区中文字幕 | 国产一区二区三区不卡在线观看 | 二区在线观看 | 久久综合激情 | 欧美在线观看www | av大全在线| 婷婷色av|