map
-
map的聲明不會配置設定記憶體,而數組一旦聲明即配置設定記憶體。
var map1 map[string]string
var map2 map[string]map[string]string
故聲明後必須make,給map配置設定資料空間
- map的key重複後将會被覆寫
- map是無序的
map的聲明
package main
import(
"fmt"
)
func main(){
// 聲明方式1
var map1 map[string]string
map1 = make(map[string]string,10) // 必須配置設定資料空間
map1["lwt"]="666" // 再指派
fmt.Println(map1)
// 聲明方式2
var map2 map[string]string = make(map[string]string,10)
map2["lwt"]="777"
fmt.Println(map2)
// 聲明方式3
var map3 = make(map[string]string,10)
map3["lwt"]="888"
fmt.Println(map3)
// 聲明方式4(直接指派)未使用到make,但直接花括号指派
var map4 = map[string]string{
"lwt4":"666",
"lwt4-1":"666", // 這裡的逗号不能省略
}
fmt.Println(map4)
fmt.Println(map4["lwt4"]) //取map的值,666
// 推薦方式5
map5 := make(map[string]string)
map5["lwt5"]="666"
fmt.Println(map5)
StuMap := make(map[string]map[string]string)
StuMap["學生1"] = make(map[string]string,2)
StuMap["學生1"]["name"] = "李威彤1"
StuMap["學生1"]["sex"] = "男"
// map嵌套後,每次都要make
StuMap["學生2"] = make(map[string]string,2)
StuMap["學生2"]["name"] = "李威彤2"
StuMap["學生2"]["sex"] = "女"
fmt.Println(StuMap)
fmt.Println(StuMap["學生2"]["name"])
// 法1式删除
StuMap = make(map[string]map[string]string)
fmt.Println("将StuMap重新聲明,即删了(法一)",StuMap)
// 法2式周遊删除
// map查找
val,ok := map4["lwt4"] // 傳回的ok為布爾值
if ok{
fmt.Println("有key,值為:",val)
}else{
fmt.Println("滾,啥都沒有")
}
}
map的周遊(for-range)
package main
import(
"fmt"
)
func main(){
map1 := make(map[string]string)
map1["lwt1"]="11"
map1["lwt2"]="22"
map1["lwt3"]="33"
map1["lwt4"]="44"
for key,value := range(map1){
fmt.Println(key,"-",value)
}
stuMap := make(map[string]map[string]string)
stuMap["學生1"]=make(map[string]string,2)
stuMap["學生1"]["name"] = "李威彤1"
stuMap["學生1"]["sex"] = "男"
stuMap["學生2"]=make(map[string]string,2)
stuMap["學生2"]["name"] = "李威彤2"
stuMap["學生2"]["sex"] = "女"
for key1,value1 := range stuMap{
fmt.Println(key1)
for key2,value2 := range value1{
fmt.Printf("\t%v-%v",key2,value2)
}
fmt.Println()
}
// 内置函數len(map1)
fmt.Println("map的len為:",len(stuMap))
}
map切片
原切片=append(原切片,新切片)
package main
import(
"fmt"
)
func main(){
var mapSlice []map[string]string // 切片嘛,不用多個map嵌套
mapSlice = make([]map[string]string,2)
if mapSlice[0] == nil{
mapSlice[0] = make(map[string]string,2)
mapSlice[0]["name"] = "牛魔王"
mapSlice[0]["age"] = "500"
}
if mapSlice[1] == nil{
mapSlice[1] = make(map[string]string,2)
mapSlice[1]["name"] = "狐狸精"
mapSlice[1]["age"] = "400"
}
fmt.Println(mapSlice)
newMapSlice := map[string]string{
"name":"鐵扇公主",
"age":"1",
}
mapSlice = append(mapSlice,newMapSlice) // 通過map切片動态增加map
fmt.Println(mapSlice)
}
map排序(新版預設升序)
package main
import(
"fmt"
"sort"
)
func main(){
map1 := make(map[int]int,10) // 已經預設升序了
map1[10] = 100
map1[1] = 11
map1[3] = 33
map1[8] = 88
fmt.Println(map1)
// 排序
var keys []int // 數組切片
for k,_ := range map1{
keys = append(keys,k)
}
sort.Ints(keys)
fmt.Println(keys)
for _,k := range keys{
fmt.Println(k,"-",map1[k]) // 此步較為關鍵,通過map的k取出映射value值
}
// 先将k周遊後存入切片數組,對切片數組進行排序,
//再将切片周遊出來的key通過map擷取對應的映射value值
}
map的注意事項
- map是引用類型,在函數外會直接修改原map。且map能動态增加擴容
func main(){
map1 := make(map[int]int,2) // 這裡雖然是2,但map會自動擴容,不報錯。
map1[0] = 0
map1[2] = 22
map1[10] = 10
modify(map1)
fmt.Println(map1)
}
func modify(map1 map[int]int){
map1[10] = 100
}
結構體初入(場景map的value通常為struct)
package main
import(
"fmt"
)
func main(){
StuMap1 := make(map[string]Student)
student1 := Student{"lwt1",22,"男"}
student2 := Student{"lwt2",22,"女"}
student3 := Student{"lwt3",21,"男"}
StuMap1["No1"] = student1
StuMap1["No2"] = student2
StuMap1["No3"] = student3
fmt.Println("StuMap1=>",StuMap1)
// 周遊學生資訊
for k,v := range StuMap1{
fmt.Println(k,"-",v)
fmt.Println("v.Name=>",v.Name)
fmt.Println("v.Age=>",v.Age)
fmt.Println("v.Sex=>",v.Sex)
}
}
type Student struct{
Name string
Age int
Sex string
}
map練習
package main
import(
"fmt"
)
func main(){
usersMap := make(map[string]map[string]string,10)
fmt.Println(usersMap)
usersMap["tom"] = make(map[string]string,2)
usersMap["tom"]["pwd"] = "999999"
usersMap["tom"]["nickname"] = "湯姆貓"
modifyUser(usersMap,"lwt")
modifyUser(usersMap,"tom")
fmt.Println(usersMap)
}
/*
傳入姓名,若姓名存在于map中,将該使用者的密碼修改為888,若不存在該姓名,則增添使用者
*/
func modifyUser(usersMap map[string]map[string]string,name string){
if usersMap[name] != nil{ // 如果userMap不為空,其必存在pwd密碼
usersMap[name]["pwd"] = "888888"
}else{
usersMap[name] = make(map[string]string,2)
usersMap[name]["pwd"] = "888888"
usersMap[name]["nickname"] = "昵稱~"+name
}
}