Go学习笔记四:map and struct

288 阅读2分钟

map Summary

  1. 一个map就是一个哈希表的引用,map类型可以写为map[K]V
  2. 定义
    • var m = make(map[string][int]) m is not nil m["str"] = int
    • var m = map[string][int]{} m is not nil m["str"] = int
    • var m map[string][int] m is nil
  3. map中所有的key都有相同的类型,所有的value也有着相同的类型,但是key和value之间可以是不同的数据类型,其中K对应的key必须是支持==比较运算符的数据类型,所以map可以通过测试key是否相等来判断是否已经存在。V对应的value数据类型则没有任何的限制。
  4. delete函数可以删除元素
    • delete(ages, "alice") // remove element ages["alice"]
    • 所有这些操作是安全的,即使这些元素不在map中也没有关系;如果一个查找失败将返回value类型对应的零值,例如,即使map中不存在“bob”下面的代码也可以正常工作,因为ages["bob"]失败时将返回0。
  5. map中的元素并不是一个变量,因此我们不能对map的元素进行取址操作
    • _ = &ages["bob"] // compile error: cannot take address of map element
    • 禁止对map元素取址的原因是map可能随着元素数量的增长而重新分配更大的内存空间,从而可能导致之前的地址无效
  6. map类型的零值是nil
  7. map上的大部分操作,包括查找、删除、len和range循环都可以安全工作在nil值的map上,它们的行为和一个空的map类似。但是向一个nil值的map存入元素将导致一个panic异常

struct summary

  1. 定义
    • type Person struct{ Id: int, Name: string, Age: uint8, }
    • var p Person
    • p结构体变量的成员可以通过点操作符访问,p.Name和p.Age。因为p是一个变量,它所有的成员也同样是变量,我们可以直接对每个成员赋值,或者 对成员取地址,然后通过指针访问。这个是和 map不一样的地方
  2. 如果结构体成员名字是以大写字母开头的,那么该成员就是导出的;这是Go语言导出规则决定的。一个结构体可能同时包含导出和未导出的成员。
  3. 完整的结构体写法通常只在类型声明语句的地方出现
  4. 一个命名为S的结构体类型将不能再包含S类型的成员:因为一个聚合的值不能包含它自身。(该限制同样适应于数组。)但是S类型的结构体可以包含*S指针类型的成员,这可以让我们创建递归的数据结构,比如链表和树结构等。