补充:在go 语言中值类型赋值都是深拷贝,引用类型一般都是浅拷贝。
map
一个拥有键值对元素的无序集合。在golang中,map是散列表的引用,map的类型是map[K]V,其中k和v是字典的键和值对应的数据类型。
- 内置函数
make可以用来创建一个map:
mapVal := make(map[string]int)
- 可以使用内置函数
delete来从字典中根据键移除一个元素,即使键不在map中,操作也是安全的:
delete(mapVal, "value") // 移除元素mapVal["value"]
map元素不是一个变量,不可以获取它的地址。map顺序是随机的,如果需要按照某种顺序来遍历map中的元素,必须显示地给键排序。如果键是字符串类型,可以使用sort包中的Strings函数来进行键的排序。- 通过一种下标方式访问
map中的元素输出两个值,第二个值是一个布尔值,用来报告该元素是否存在。
if mapValue, ok := mapValues["val"]; !ok { /* ... */ }
map值类型本身可以是复合数据类型。
结构体
将零个或者多个任意类型的命名变量组合在一起的聚合数据类型。
(个人思考):这里的指针跟c/c++有所不同,这里的指针可以用.直接访问结构体,而c/c++需要->来访问或者需要(*ptr)之后用.访问。
- 如果一个结构体的成员变量名称是首字母大写的,那么这个变量是可导出的,这个是
Go最主要的访问控制机制。 - 命名结构体类型不可以定义一个拥有相同结构体类型的成员变量,但可以定义一个指针类型。
type tree struct {
value int
left, right *tree
}
结构体字面量
结构体类型的值可以通过结构体字面量来设置。
- 有两种格式的结构体字面量:
- 按照正确的顺序为每个成员量指定一个值。但这样会给开发和阅读代码的人增加负担。
- 通过指定部分或者全部成员变量的名称和值来初始化结构体变量。如果在这种初始化方式下没有指定,那么该成员变量类型就是默认的该类型零值。
两种初始化方式不可以混合使用。两种方式都绕不过不可导出变量无法在其他包中适用的规则。
- 结构体类型的值可以作为参数传递给函数或者作为函数的返回值。出于效率的考虑,大型的结构体通常都使用结构体指针的方式直接传递给函数或者从函数中返回。在需要修改结构体内容的时候也是必需的,在
Go按值调用的语言中,调用的函数接收到的是实参的一个副本,并不是实参的引用。
结构体比较
如果结构体的所有成员变量都可以比较,那么这个结构体就是可比较的。
- 可比较的结构体类型都可以作为
map的键类型。