# GOLang type 复合类型map
### Author 品茶
> go中的map就是一个key:value的hash,与python中的字典一样。
1. 支持增册改查
2. 支持嵌套,包括其它类型
3. 可以使用map 和make来创建字典,map需要初始化,而make定义的时候就需要初始化
4. 两个相同的map是不支持比较的,go强类型语言
5. make创建的map未赋值之前是零值nil,具体得看value
6. 可以间接实现set
~~~
func main() {
//mape and init a map
ages := map[string]string{
"name": "zwhset",
"age": "17",
}
//use make
age2 := make(map[string]int)
age2["nice"] = 1
age2["good"] = 2
fmt.Println(ages["name"], ages["age"])
fmt.Println(age2["nice"], age2["good"])
// if key not found return zero value
//常用于结构定义
a := make(map[string]string)
a["name"] = "zwhset"
a["passwd"] = "goodjob"
//这种用于初始化比较多
b := map[string]string{
"name": "zwhset",
"passwd": "goodjob",
}
}
~~~
~~~
func main() {
// 增 册 改 查
// 增 改 -> x[key] = value
// 册 -> delete(x,key)
// 查 -> x[kye]
// 测试是否有key,可以用ok button方法 age, ok := ages["bob"]
// 初始化为零值
// var x make(map[string]string) == nil
//mape and init a map
ages := map[string]string{
"name": "zwhset",
"age": "17",
}
// 下标访问
fmt.Println(ages["name"])
// 删除元素
delete(ages, "name")
// 元素不存在时检索会返回对应零值,这里的值是string -> "" int -> 0
// 不能对元素取址操作,因为随着元素增长,内存空间会重新分配所以取址可能无效
// 遍历全部元素,注意他是无序的
for key, value := range ages {
fmt.Println(key, value)
}
// 如果想要有序的话,需要中转一下
var names []string
//names := make([]string, 0, len(ages)) // slice 这种方式更效率
for name, _ := range ages {
names = append(names, name) // use names = action
}
sort.Strings(names) // sort names
for _, name := range names { // only name
fmt.Println(name, ages[name]) // name , ages[name]
}
//age, ok := ages["age1"]
//if !ok {
// fmt.Println("age not in ages")
//}
//fmt.Println(age)
// 更好的一种方式
if _, ok := ages["age1"]; !ok {
fmt.Println("age not in ages")
}
// map是不能比较的,如果要比较两个map是否有相同的KEY和 value使用 equal方法
// go中并没有set的方法,但可以用map方法间接实现, map[string]bool map [type]bool
}
~~~