01、指针:不同于c语言的指针可直接操作
--go语言中指针只能
--取地址 以及 按照地址取值
--指针不能够直接操作取值,尽管牺牲了效率但是避免了溢出的问题
--代码示例:
// 1、取地址:&
// 2、按照地址取值:*
n := 18
p := &n
fmt.Println(p) // 取出变量地址
fmt.Printf("%T\n", p) // *int 表示int类型的指针
// 按照地址取值
m := *p
fmt.Println(m) // 取出地址对应的值
fmt.Printf("%T\n", m) // 地址对应的值的类型 int
02、new:给基础数据类型变量分配地址
--指定变量直接使用会有问题,报错空指针
// 一个指针只进行定义,没有初始化值都会被认为是nil空指针,即报错
// panic: runtime error: invalid memory address or nil pointer dereference
var a *int
*a = 100
fmt.Println(*a)
--new()函数初始化指针的时候会给一个地址:
// new关键字申请地址
var a1 *int
fmt.Println(a1) // <nil>
var a2 = new(int)
fmt.Println(a2) // 0xc0000100b8
fmt.Println(*a2) // 在赋值之前打印其值为0
*a2 = 100
fmt.Println(*a2) // 在赋值之后之后打印值为100
3、make:给slice map 以及 channel三种数据类型变量分配地址
--make:make也是用于内存分配的,区别于new,它只用于slice、map以及chan的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。
--就是slice切片中初始化切片的那个make函数
4、new与make的区别
1、二者都是用来做内存分配的。
2、make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身;
3、而new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。