指针
go语言都是安全指针,不能够偏移和运算,只能够利用指针得到变量,和由变量得到指针,只需要记住两个操作:
&
:取对应变量的地址
*
根据地址获得变量
make和new函数都是用来分配内存的,区别如下
new给基本类型(
int
,string
)申请内存的,主要用于分配值类型,并且内存对应的值为类型零值,返回的是基本类型的指针(*string
,*int
)
make用来给slice
,map
,channel
申请内存的,主要用于分配引用类型,返回值就是类型本身
package main
import "fmt"
func main() {
//&查看变量地址
n := 18
p := &n
fmt.Printf("value=%v,type=%T\n", p, p)
//*根据地址取值
fmt.Println(*p)
a := 10
b := &a
fmt.Printf("a:%d ptr:%p\n", a, &a) // a:10 ptr:0x0000ac0b0
fmt.Printf("b:%p type:%T\n", b, b) // b:0x0000ac0b0 type:*int b存储了a的地址
fmt.Println(&b) // 0xc00000d8020,b自己也开辟了空间,有自己的地址
//指针为引用类型,声明引用类型不会开辟内存,可以用new和make函数开辟内存,值类型的在声明时就分配内存了
//new分配内存,参数为一个类型,返回值就是这个类型的指针,不常用
var a1 *int
var a2 = new(int)
fmt.Println(a1, a2) //a1为空,a2有地址
fmt.Println(*a2) //默认为零值
*a2 = 100
fmt.Println(*a2) //修改后的值
//make只作用于slice、map以及chan的内存创建,返回这三个类型本身,而不是指针了
c := make(map[string]int, 10)
c["卡卡"] = 100
fmt.Println(c)
}