遇见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))
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值