目录
1.map定义方式
map[keyType]valueType keyType通常是int或者string类型,也可以是接口,结构体或者是数组.
\
- 声明一个map是不会分配内存的,需要使用make去初始化才能使用.
- go里面的map是完全没有顺序的。
- key是不能重复的,如果重复了,以最后一个为准,value是可以重复的。
- key的类型通常是int,string。不可以是slice,map func, 因为他们无法用==来判断。
2.map的三种使用方式
1.先声明,再make
//声明map
var a map[string]string
// make初始化一个map make的类型是map[string]string 大小是10
a = make(map[string]string, 10)
a["1"] = "10"
a["1"] = "11"
println(a["1"])
2.声明的时候make
var b map[string]string = make(map[string]string, 10)
m := make(map[string]string)
m["1"] = "11"
println(m["1"])
3.声明的时候赋值
m2 := map[string]string{"key": "value"}
println(m2["key"])
var m3 map[string]string = map[string]string{"key2": "value"}
println(m3["key2"])
3.map的crud操作
m := make(map[string]string)
//新增
m["1"] = "11"
//修改
m["1"] = "12"
//删除
delete(m, "1")
//清空map
m = make(map[string]string)
println(m["1"])
判断map中是否存在这个key,如果有存在值是多少?
4.map的遍历
m2 := map[string]string{"key1": "value1", "key2": "value2", "key3": "value3", "key4": "value4", "key5": "value5"}
for key, val := range m2 {
fmt.Printf("key: %v,value:%v", key, val)
}
len()函数可以统计map的大小
5.结构体的内存布局
- 结构体是一种自定义的数据了类型,变量是他的一个具体的实例
- 当我们声明一个结构体变量时,数据空间已经为我们分配好了,在你没有赋值的时候,每一种默认的数据类型也给他了
6.结构体的使用方式
1.先声明再赋值
2.方式2 返回的是结构体的变量
p := Person{"wx", 30}
3.使用new,返回一个指针的类型
p2 := new(Person)
//优化前
(*p2).Name = "wx"
//优化后
p2.Age = 20
4.使用&符号来处理 返回的依然是指针
var p4 *Person = &Person{}
p3 := &Person{}
p3.Name = "wx"
p4.Name = "wx"
7.结构体的内存分配机制
两个不同的结构体的变量,他们指向的内存空间是不同的,他是值拷贝
8.结构体使用的注意事项和细节
- 结构体的字段在内存中是连续分布的
- 结构体是用户自定义的类型,如果需要两个结构体之间进行转换,需要他们的两个的字段完全相同(名字,类型,个数)
- 结构体的type可以重新定义(相当于取别名),Golang认为他是新的数据类型,但是相互间可以强转
- 在结构体的每一个tag上,该tag可以通过反射机制来获取,常见的使用场景就是序列号和反序列化
一般我们会将结构体的首字母进行大写,目的是方便在其他包里面同时也能够访问到他,(如果都是小写,那么在其他包里面序列化出来后都是null),但是我们通常会将结构体的转换为json后给其他程序使用,比如给java程序去使用,在java里面对于属性的首字母大写是不习惯的,这个时候我们就可以加上tag来解决这个问题
加上tag:
这次打印的都是小写的: