8、指针
区别于c++当中的指针 ,Go当中不能对指针进行偏移/运算,是一种安全指针
变量取地址 :&a
地址取值 : *a
关于 new 和 make :
func main() {
var a *int
*a = 100
fmt.Println(*a)
var b map[string]int
b["沙河娜扎"] = 100
fmt.Println(b)
}
对于普通的值类型,声明之后就会自动分配内存 ;但是这样的一些类型,声明变量之后,还没有对其分配内存,此时直接对其进行赋值,则会引发panic ,因此需要手动对其分配内存
func new(Type) *Type a = new(int) , new 函数只接受类型参数 ,返回对于类型的指针
func make(t Type, size …IntegerType) Type 只能用于slice ,map 与channel
slice 需要制定三个参数 ,map需要指定两个
new 与 make的关系:
1、二者都是用于分配内存的
2、make只能用于slice 、map 、 channel三种类型的内存分配,返回的是三种引用类型本身
3、new用于类型的内存分配,分配之后对应内存存储的是类型零值,返回值是类型指针
9、panic处理
defer 可以让语句在函数结束时 延迟执行
函数的其他语句全部执行完毕,再以此处理带有defer 的代码块
defer部分类似于 栈的处理
func main() { fmt.Println("start...") defer fmt.Println("1") defer fmt.Println("2") defer fmt.Println("3") fmt.Println("end...") // start... // end... // 3 // 2 // 1 }
在遇到代码块可能引发panic时,可以通过defer 与 recover 一起处理,让代码顺利执行
//defer必须与recover一起使用 //recover 必须写在可能引起panic的语句前面 func b() { defer func() { err := recover() if err != nil { fmt.Println(" func b err") } }() panic("panic in b") }
10、map
一种key-value的映射关系容器,底层实现为 散列表 hash ,是一种引用类型,必须初始化才可以赋值
make(map[KeyType]ValueType, [cap])
cap虽然不是必须的,但是理应在初始化时 为其指定一个容量 , map也支持在声明的时候填充元素
判断某一个key是否存在 :
value, ok := map[key]
通过for range对其进行遍历,delete(mapname , key) 按照键 对其进行删除
map内部的key存储顺序与 插入顺序无关 ,因此需要进行操作:
func main() {
rand.Seed(time.Now().UnixNano()) //初始化随机数种子
va