funcmain(){
var a int=10var p *int=&a
a =100
fmt.Println("a = ", a)*p =250// 借助a 变量的地址,操作a对应空间
fmt.Println("a = ", a)
fmt.Println("*p = ",*p)
a =1000
fmt.Println("*p = ",*p)}
funcmain(){
var p *int
p =new(int)// 对应类型的默认值
fmt.Println(*p)// 0}funcmain(){
var p *bool
p =new(bool)// 对应类型的默认值
fmt.Println(*p)//false}
5 - 左值与右值
左值:等号 左边的变量,代表 变量所指向的内存空间。 (写)
右值:等号 右边的变量,代表 变量内存空间存储的数据值。 (读)
var a int=10var b int=20// b是左值
a = b // b是右值
6 - 指针的函数传参
函数传参方式:函数传参永远是值传递(传引用传递的是地址的值)
传地址(引用):将形参的地址值作为函数参数传递
传值(数据据):将实参的 值 拷贝一份给形参
指针的函数传参
传引用:在A栈帧内部,修改B栈帧中的变量值
funcswap(a, b int){
a, b = b, a
fmt.Println("swap a:", a,"b:", b)// swap a: 20 b: 10}funcswap2(x, y *int){
*x,*y =*y,*x
}funcmain(){
a, b :=10,20swap(a, b)
fmt.Println("swap: main a:", a,"b:", b)// swap: main a: 10 b: 20swap2(&a,&b)// 传地址值
fmt.Println("swap2: main a:", a,"b:", b)// swap2: main a: 20 b: 10}
二、切片加强
1 - 切片的基础与本质
为什么用切片:在Go语言当,我们几乎可以在所有的场景中,使用切片替换数组使用
数组的容量固定,不能自动拓展
值传递: 数组作为函数参数时,将整个数组值拷贝一份给形参
切片的本质:
不是一个数组的指针,是一种数据结构体,用来操作数组内部元素
切片并不是数组或数组指针,它通过内部指针和相关属性引用数组片段,以实现变长案
数组和切片定义的区别
创建数组时 ,[n]内指定数组长度
创建切片时,[]内为空,或者 …(很少使用…)
2 - 切片截取、创建、append和copy
切片截取:切片名称 [ low : high : max ](截取数组,初始化 切片时,没有指定切片容量时, 切片容量跟随原数组(切片))