map需要注意的是在使用前需要进行初始化,即使用make为map初始化内存,否则是一个nil值。
map与json互转
json转map示例:
package main
import(
"fmt"
"encoding/json"
)
func main(){
jsonStr := `
{
"name":"Lee",
"age":"eighteen"
}`
var mapResult map[string]interface{}
json.Unmarshal([]byte(jsonStr),&mapResult)
fmt.Println(mapResult)
}
输出:
map[age:eighteen name:Lee]
map转json示例:
package main
import(
"fmt"
"encoding/json"
)
func main(){
testMap := map[string]string{
"type":"No.1",
"quality":"best",
}
jsonResult,_ := json.Marshal(testMap)
fmt.Println(string(jsonResult))
}
输出:
{"quality":"best","type":"No.1"}
map排序
Go语言中map默认是无序的,无论是按照key还是按照value默认都不排序,如果要对map进行排序,将key或者value复制到一个切片中,再对切片进行排序。
按Key排序
示例:
package main
import(
"fmt"
"sort"
)
func main(){
var mapInt map[int]int
mapInt = make(map[int]int,5)
mapInt[1] = 88
mapInt[0] = 66
mapInt[2] = 99
var b []int
fmt.Println("排序前:")
for k,v := range mapInt{
fmt.Println(k,v)
b = append(b,k)
}
sort.Ints(b)
fmt.Println("排序后:")
for _,v := range b{
fmt.Println(v,mapInt[v])
}
}
输出:
排序前:
0 66
2 99
1 88
排序后:
0 66
1 88
2 99
按Value排序
核心在于保存key的切片的排序按照value的排序规则来排,示例:
package main
import(
"fmt"
"sort"
)
func main(){
mapTest := map[string]int{
"tom":88,
"jerry":96,
"white":92,
}
fmt.Println("排序前:")
for k,v := range mapTest{
fmt.Println(k,v)
}
strSlice := make([]string,0,len(mapTest))
for k:=range mapTest{
strSlice = append(strSlice,k)
}
sort.Slice(strSlice,func(i ,j int) bool{
return mapTest[strSlice[i]] > mapTest[strSlice[j]]
})
fmt.Println("排序后:")
for _,v := range strSlice{
fmt.Println(v,mapTest[v])
}
}
输出:
排序前:
tom 88
jerry 96
white 92
排序后:
jerry 96
white 92
tom 88
按照字符出现的频率降序
示例:
package main
import(
"fmt"
"sort"
)
type frequence struct{
char string
fre int
}
func frequences(s string)[]frequence{
mapFrequence := make(map[string]int)
var freq []frequence
for _,v := range s{
mapFrequence[string(v)]++
}
for k,v := range mapFrequence{
fr := frequence{
char : k,
fre : v,
}
freq = append(freq,fr)
}
sort.Slice(freq,func(i,j int)bool{
return freq[i].fre > freq[j].fre
})
return freq
}
func main(){
s := "heelllooowaaaaa"
freqs := frequences(s)
fmt.Println(freqs)
}