首頁 > 後端開發 > Golang > 一篇文章帶你了解Go語言基礎之map

一篇文章帶你了解Go語言基礎之map

發布: 2023-07-25 17:05:16
轉載
709 人瀏覽過

前言

Hey,大家好呀,我是星期八,這次咱們繼續學習Go基礎之map扒。


回憶往事

在上述的多篇文章中,我們學習了資料型別切片

等幫助我們儲存資料。

尤其是切片,可以儲存多個東西,並且可以靈活的增刪改查。

但切片還是有不太方便的地方。 例如學生,一個學生的資訊是多個的,例如名稱

#身高

#1

##,############################################################################## ####等。 ############如果使用切片,我們可能是這樣儲存的。 #########
package main


import "fmt"


func main() {
    //学生1
    var stu1 = []string{"张三", "188", "70KG", "18"}
    //学生2
    var stu2 = []string{"李四", "170", "66KG", "17"}
    fmt.Println(stu1)
    fmt.Println(stu2)
}
登入後複製
#########如果按照目前所接受的知識,只能到這了,我也只能想到這一點。 ##########

但是會有一個明顯的缺點,就是我們需要透過下標取值##或修改值

而且我們還得數一下想修改的值的下標在哪個位置,相對來說,不是那麼方便。


引入map

map,在Python中叫字典,Java中也叫map,PHP好像列表就帶有map的功能。

map是鍵值對(key-value)。儲存結構,是 無序的,內部使用哈希(hash)實現,性能很高。

在Go中,map是引用#類型,記憶體圖如下。

一篇文章帶你了解Go語言基礎之map#

map基本使用

map语法

方式一,声明时赋值
var 变量名 = map[key类型][value类型]{
    key:value,
    key:value,//必须使用,结尾,否则会报错
}
//方式二,make方式
var 变量名 = make(map[key类型]value类型, 容量(cap))
//如果map是make方式声明的,第二个参数直接就是容量,元素个数是0,没有第三个参数
登入後複製

示例

方式一,声明时赋值

代码

package main


import "fmt"


func main() {
    var stu1 = map[string]string{
        "Name":   "张三",
        "Age":    "18",
        "height": "188", //每行都要以,结尾,
}
    var stu2 = map[string]string{
        "Name":   "李四",
        "Age":    "20",
        "height": "170", //每行都要以,结尾,
}
    fmt.Println(stu1, stu2) 
    //map[Age:18 Name:张三 height:188] map[Age:20 Name:李四 height:170]
}
登入後複製

方式二,make方式

代码

package main


import "fmt"


func main() {
    var stu1 = make(map[string]string,10)
    stu1["Name"] = "张三"
    stu1["Age"] = "18"
    stu1["height"] = "188"


    var stu2 = make(map[string]string,10)
    stu2["Name"] = "李四"
    stu2["Age"] = "20"
    stu2["height"] = "170"
    fmt.Println(stu1,stu2)
    //map[Age:18 Name:张三 height:188] map[Age:20 Name:李四 height:170]
}
登入後複製

ps:关于这两种方式,哪个使用的多。

我的建议是,如果确定有多少个字段,就使用第一种,如果不确定多少个字段,是动态添加的,用第二种。

使用第二种要大概估算好容量,超过会触发自动扩容机制,可能会产生那么一丝丝的性能影响。


遍历map(查)

遍历map,通常只用一种方式for range

代码

package main


import "fmt"


func main() {
    var stu1 = make(map[string]string, 10)
    stu1["Name"] = "张三"
    stu1["Age"] = "18"
    stu1["height"] = "188"


    for key, value := range stu1 {
        //map遍历时,key值键,value是值
        fmt.Println(key, value)
  }
}
登入後複製

只遍历key

package main


import "fmt"


func main() {
    var stu1 = make(map[string]string, 10)
    stu1["Name"] = "张三"
    stu1["Age"] = "18"
    stu1["height"] = "188"


    for key := range stu1 {
        //只遍历key
        fmt.Println(key)
  }
}
登入後複製

修改map的值(改)

package main


import "fmt"


func main() {
    //var stu1 = make(map[string]string, 10)
    //stu1["Name"] = "张三"
    //stu1["Age"] = "18"
    //stu1["height"] = "188"
    //
    //stu1["Name"] = "张三666"//修改
    //fmt.Println(stu1)


    //同上
    var stu1 = map[string]string{
        "Name":   "张三",
        "Age":    "18",
        "height": "188", //每行都要以,结尾,
}
    stu1["Name"] = "张三666"//修改
    fmt.Println(stu1)
}
登入後複製

删除map里面的值

删除map里面的值需要用到delete

代码

package main


import "fmt"


func main() {


    var stu1 = map[string]string{
        "Name":   "张三",
        "Age":    "18",
        "height": "188", //每行都要以,结尾,
}
    fmt.Println(stu1)    //map[Age:18 Name:张三 height:188]
    delete(stu1, "Name") //删除key以及key对应的值
    fmt.Println(stu1)    //map[Age:18 height:188]
}
登入後複製

map取值注意事项

map在取值时,尽可能的判断一下是否key存在

package main


import "fmt"


func main() {


  var stu1 = map[string]string{
    "Name":   "张三",
    "Age":    "18",
    "height": "188", //每行都要以,结尾,
  }
  //result := stu1["Name"]//key存在,没问题
  //fmt.Println(result)//张三
  //result := stu1["Names"]//手一抖,key打错了
  //fmt.Println(result)//结果为空,显然不是太友好


  //取值标准用法
  result, ok := stu1["Name"]
  //如果key存在,ok为true,如果key不存在,ok为false
  fmt.Println(result,ok)//张三 true
  if ok {
    fmt.Println(result)
  } else {
    fmt.Println("key不存在")
  }
}
登入後複製

总结

上述我们学习了Go基础之map。如果在操作过程中有任何问题,记得下面讨论区留言,我们看到会第一时间解决问题。

以上是一篇文章帶你了解Go語言基礎之map的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:Go语言进阶学习
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板