指针
简单的例子:
func main() {
var a int = 10
var b *int = &a
fmt.Println("a=", a)
fmt.Println("&a=", &a)
//fmt.Println("*a=", *a)
fmt.Println("b=", b)
fmt.Println("&b=", &b)
fmt.Println("*b=", *b)
}
/*
a= 10
&a= 0xc0000160a8
b= 0xc0000160a8
&b= 0xc000006030
*b= 10
*/
- x : 该空间存放的值
- &x : 该空间的地址
- *x : 该指针指向的值(只能指由针使用)
//同理,若此时修改*b的值:
func main() {
var a int = 10
var b *int = &a
*b = 100
fmt.Println(a)
}
/*
100
*/
值类型和引用类型
(1)值类型:变量直接存储值,内存通常在栈中分配
常见的值类型:基本数据类型(int, float, bool, string),数组,结构体struct 等。
var a int = 100 : a -> 100
(2)引用类型:变量存储的是一个地址,这个地址对应的空间才是真正存储数据的位置,内存通常在堆上分配。当没有任何变量引用这个地址,该地址对应的数据空间成为一个垃圾,由GC回收。
常见的引用类型:指针,slice切片,map,管道chan,interface 等。
var b *int = &a : b -> &a -> 100