遇见go语言的第四天——map、结构体

map介绍

map是key-value数据结构,又称为字段或者关联数组,类似其他编程语言的集合,在编程中经常使用到。

  • 基本语法

    var map(变量名称)map[keytype]valuetype

    golang中的map的key可以是很多类型,比如bool,数字,string,指针,channel,还可以是只包含前面几个类型的接口,结构体,数组
    通常为int,string

注意:

slice,map还有function不可以,因为这几个没法用==来判断
注意:map声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用

func main()  {
	var a map[string]string
	a = make(map[string]string,10)
	a["name1"] = "宋江"
	a["name2"] = "张飞"
	fmt.Println(a)

	cites := make(map[string]string)
	cites["name1"] = "北京"
	cites["name2"] = "天津"
	cites["name3"] = "上海"
	fmt.Println(cites)

	heroes := map[string]string{
		"hero1" : "吴用",
		"hero2" : "宋江",
	}
	fmt.Println(heroes)
}
  • 说明:
  • [1] 在使用map前,需要先make,make的作用就是给map分配数据空间
  • map的key是不能重复的,如果重复了,则以最后这个key-value为准
  • map的value是可以相同的
  • map的key-value是无序的
  • make默认分配一个

实例:存放三个学生信息,每个学生有name和sex信息

	student := make(map[string]map[string]string)
	student["stu1"] = make(map[string]string,2)
	student["stu1"]["name"] = "tom"
	student["stu1"]["sex"] = "男"

	student["stu2"] = make(map[string]string,2)
	student["stu2"]["name"] = "tony"
	student["stu2"]["sex"] = "男"

	student["stu3"] = make(map[string]string,2)
	student["stu3"]["name"] = "mary"
	student["stu3"]["sex"] = "女"

	fmt.Println(student)
  • map的增删查改
	delete(a,"name1")
	fmt.Println(a)
val,ok := a["name2"]
	if ok{
		fmt.Printf("有,值为%v\n",val)
	}else {
		fmt.Printf("没有\n")
	}
  • map遍历
for k,v := range cites{
		fmt.Printf("k = %v  v = %v\n",k,v)
	}
//切片的使用
	monsters := make([]map[string]string,2)
	if monsters[0] == nil{
		monsters[0] = make(map[string]string,2)
		monsters[0]["name"] = "牛魔王"
		monsters[0]["age"] = "500"
	}
	if monsters[1] == nil{
		monsters[1] = make(map[string]string,2)
		monsters[1]["name"] = "白骨精"
		monsters[1]["age"] = "1000"
	}
	//使用切片的append函数,可以动态的增加monster
	newmonsters := map[string]string{
		"name" : "玉兔精",
		"age" : "600",
	}
	monsters = append(monsters,newmonsters)
	fmt.Println(monsters)
  • map是引用类型,遵守引用类型传递机制,在一个函数接受map,修改后,会直接修改原来的map
  • map的容量达到后,在想map增加元素,会自动扩容,并不会发生panic,也就是说map能动态的增长键值对
  • map的value也经常使用struct类型,更适合管理复杂的数据,比如value为studet结构体
type stu struct {
	Name string
	Age int
	Address string
}
func main()  {
	students := make(map[string]stu,10)
	stu1 := stu{"a",18,"西安"}
	stu2 := stu{"b",19,"天津"}
	students["num1"] = stu1
	students["num2"] = stu2
	fmt.Println(students)
}

面向对象

type Cat struct {
	Name string
	Age string
	Color string
}
type Person struct{
	Name string
	Age string
	arr *int
	slice []int
	map1 map[string]string
}
func main()  {
	var a Person
	//在使用slice之前,一定要用make
	a.slice = make([]int,10)
	a.slice[0] = 100
	//在使用map之前,一定要用make
	a.map1 = make(map[string]string)
	a.map1["数学"] = "120"
	fmt.Println(a)
	
	var b *Person = new(Person)
	//因为b是一个指针,因此标准的给字段赋值的方式如下
	b.Name = "smith"
	b.Age = 30
	fmt.Println(b)
	
	var cat1 Cat
	cat1.Name = "小白"
	cat1.Age = "10"
	cat1.Color = "白色"
	fmt.Println(cat1)
}

  • 指针、slice、map的零值都是nil,即还没有分配空间
  • 结构体是用户单独定义的类型,和其他类型进行转换时需要有完全相同的字段
  • 结构体进行type重新定义(相当于取别名),golang认为是新的数据类型,但是相互间可以相互转换。
  • struct的每个字段上,可以写一个tag,该tag可以通过反射机制获取,常见的使用场景就是序列化和反序列化。
type Monster struct {
	Name string `json:"name"`
	Age int `json:"age"`
	Skill string `json:"skill"`
}
func main()  {
	monster := Monster{"牛魔王",2000,"芭蕉扇"}
	//将monster变量序列化为json格式字符串
	jsonmonster,_:= json.Marshal(monster)
	fmt.Println(string(jsonmonster))
}
已标记关键词 清除标记
相关推荐
课程简介: 历经半个多月的时间,Debug亲自撸的 “企业员工角色权限管理平台” 终于完成了。正如字面意思,本课程讲解的是一个真正意义上的、企业级的项目实战,主要介绍了企业级应用系统中后端应用权限的管理,其中主要涵盖了六大核心业务模块、十几张数据库表。 其中的核心业务模块主要包括用户模块、部门模块、岗位模块、角色模块、菜单模块和系统日志模块;与此同时,Debug还亲自撸了额外的附属模块,包括字典管理模块、商品分类模块以及考勤管理模块等等,主要是为了更好地巩固相应的技术栈以及企业应用系统业务模块的开发流程! 核心技术栈列表: 值得介绍的是,本课程在技术栈层面涵盖了前端和后端的大部分常用技术,包括Spring Boot、Spring MVC、Mybatis、Mybatis-Plus、Shiro(身份认证与资源授权跟会话等等)、Spring AOP、防止XSS攻击、防止SQL注入攻击、过滤器Filter、验证码Kaptcha、热部署插件Devtools、POI、Vue、LayUI、ElementUI、JQuery、HTML、Bootstrap、Freemarker、一键打包部署运行工具Wagon等等,如下图所示: 课程内容与收益: 总的来说,本课程是一门具有很强实践性质的“项目实战”课程,即“企业应用员工角色权限管理平台”,主要介绍了当前企业级应用系统中员工、部门、岗位、角色、权限、菜单以及其他实体模块的管理;其中,还重点讲解了如何基于Shiro的资源授权实现员工-角色-操作权限、员工-角色-数据权限的管理;在课程的最后,还介绍了如何实现一键打包上传部署运行项目等等。如下图所示为本权限管理平台的数据库设计图: 以下为项目整体的运行效果截图: 值得一提的是,在本课程中,Debug也向各位小伙伴介绍了如何在企业级应用系统业务模块的开发中,前端到后端再到数据库,最后再到服务器的上线部署运行等流程,如下图所示:
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页