Go--08(map与结构体struct)

本文详细介绍了Go语言中Map的定义、使用方式、CRUD操作、遍历方法,以及结构体的内存布局、使用技巧、内存分配机制和注意事项。通过实例展示了如何声明、初始化、操作Map,以及结构体的声明、赋值和指针使用。同时,讨论了结构体在内存中的分布和转换规则,并提到了反射在序列化和反序列化中的应用。
摘要由CSDN通过智能技术生成

目录

1.map定义方式 

2.map的三种使用方式

 3.map的crud操作

 4.map的遍历

 5.结构体的内存布局

 6.结构体的使用方式

 7.结构体的内存分配机制

 8.结构体使用的注意事项和细节


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:

  

  这次打印的都是小写的:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空恋旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值