指针(pointer)在Go语言中可以被拆分为两个核心概念:
- 类型指针,允许对这个指针类型的数据进行修改,传递数据可以直接使用指针,而无须拷贝数据,类型指针不能进行偏移和运算。
- 切片,由指向起始元素的原始指针、元素数量和容量组成。
切片比原始指针具备更强大的特性,而且更为安全。
package main import ( "fmt" ) func main() { var cat int = 1 var str string = "banana" fmt.Printf("%p %p", &cat, &str)
// 对指针进行取值操作 value := *ptr // 取值后的类型 fmt.Printf("value type: %T\n", value)
}
运行结果:
0xc042052088 0xc0420461b0
使用 fmt.Printf 的动词%p
打印 cat 和 str 变量的内存地址,指针的值是带有0x
十六进制前缀的一组数据。
提示:变量、指针和地址三者的关系是,每个变量都拥有地址,指针的值就是地址。
当使用&
操作符对普通变量进行取地址操作并得到变量的指针后,可以对指针使用*
操作符,也就是指针取值
new() 函数可以创建一个对应类型的指针,创建过程会分配内存,被创建的指针指向默认值。
栈(Stack)是一种拥有特殊规则的线性表数据结构。
栈可用于内存分配,栈的分配和回收速度非常快
扫描二维码关注公众号,回复:
8447423 查看本文章
堆分配内存和栈分配内存相比,堆适合不可预知大小的内存分配。但是为此付出的代价是分配速度较慢,而且会形成内存碎片。