标签:capacity 长度 value cap roo fine garbage 错误信息 定义变量
这章主要描述如何定义变量、常量、go内置类型及go程序设计中的一些技巧go中定义变量的方式很多:
常量就是确定的值,无法改变。(可以是布尔值、可以是字符串、数值等类型)
语法如下:
const name type = value
go语言中三种内置文本类型:string、(字节)byte、(符文)rune
map类型类似于python中字典。实际就是键值对的集合。语法格式如下:
声明变量,默认map是nil,nil map不能直接赋值,默认是0
var map_variable_name map[key_data_type]value_data_type
使用make函数创建一个非nil的map,因为nil map不能存放键值对。
map_variable_name = make(map[key_data_type]value_data_type,cap)
简洁的:map_variable_name := map[key_data_type]value_data_type{k1:v1,k2:v2,….}
以下是两种定义例子
上面的cap可以省略,但是在用时最好合理设置,为什么?
如果里面的key-value键值对超出容量,则容量会自动扩容(因为每一次的扩容都是重新分配内存和拷贝)
map中的key是独一无二的。
使用len()可以获得元素个数
使用delete()可以操作键值对的删除
delete(key,value) //注意不能是nil map,否则会抛出异常panic。
使用for….range对map进行迭代操作。
map的读取和设置类似于slice,通过key来进行操作,但是又有所不同,map中key可以是int、string、float(最好不用float)(只要是支持==或者!=类型的都可以,这里函数、map、slice不支持),而slice中的索引只能是int类型。value可以是其他任意类型。
map查找比线性搜索快,但是比使用索引访问数据的类型慢很多(据说慢100倍)。
注意:
1)map中的元素不是变量,因此不能寻址。具体原因是:map可能会随着元素的增多重新分配更大的内存空间,旧值都会拷贝到新的内存空间,因此之前的地址就会失效。
2)map中使用for…range遍历,(也就是说不能使用索引的方式获取键值,但是可以重新赋值)同时它的迭代顺序是不确定的,也就是说每执行一次结果的顺序都可能不同。在go语言中是有意的这么设计,是为例避免程序依赖于某种哈希实现,目的是为了程序的健壮。如果非要按顺序遍历,必须显示对key排序,可以使用sort包中的String函数。代码如下,一般最好不要这样使用。
import “sort”
var names []string
for ,name := range ages {
names = append(names, name)
}
sort.Strings(names)
for , name := range names {
fmt.Printf("%s\t%d\n", name, ages[name])
}
map中如果没有该key则返回值为0,但是如果该key存在且键值是0,如何判断?
map功能的查找:
value, ok := map[“1”]
if ok{
//处理查到的value值
}
标签:capacity 长度 value cap roo fine garbage 错误信息 定义变量
原文地址:http://blog.51cto.com/laodou/2058697