1、对于基本数据类型,变量存储的就是值,也叫值类型。
2、获取变量的地址,用&。eg:
package main
import (
"fmt"
)
func main() {
var num int = 100
fmt.Println("num的地址=", &num)
}
//输出结果:num的地址= 0xc0000a6058
3、指针变量存储的值是一个地址,这个地址指向的空间中存储值。
4、获取指针类型所指向的值,用*。通过 *指针变量 来访问对应地址中的值。eg:
package main
import (
"fmt"
)
func main() {
var num int = 100
fmt.Println("num的地址=", &num)
var ptr *int = &num
fmt.Println("获取ptr所指向的值 *ptr = ", *ptr)
}
//输出结果:
// num的地址= 0xc00000e088
// 获取ptr所指向的值 *ptr = 100
二、指针的简单使用
通过指针修改变量值,eg:
package main
import (
"fmt"
)
func main() {
var num int = 100
fmt.Println("num的地址=", &num)
var ptr *int = &num
fmt.Println("获取ptr所指向的值 *ptr = ", *ptr)
//修改值
*ptr = 99
fmt.Println("num的新值=", num)
}
//输出结果:
// num的地址= 0xc0000a6058
// 获取ptr所指向的值 *ptr = 100
// num的新值= 99
指针类型不匹配报错:
package main
import (
"fmt"
)
func main() {
var num int = 100
var ptr *float64 = &num
}
报错提示如下:
四、值类型和引用类型1、使用指针时需要注意数据类型的匹配。int对应的指针类型就是 * int,float64对应的指针类型就是 * float64。
2、值类型,都有对应的指针类型,形式为 *数据类型。
1、值类型包括:基本数据类型int系列、float系列、bool、string;数组和结构体struct。
2、引用类型包括:指针、slice切片、map、管道chan、接口interface等。
值类型 | 引用类型 |
---|---|
基本数据类型int系列、float系列、bool、string;数组和结构体struct | 指针、slice切片、map、管道chan、接口interface等 |
值类型和引用类型的使用特点:
1、值类型:变量直接存储值,内存通常在栈中分配。
2、引用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据(值),内存通常在堆上分配。当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,由GC来回收。
栈区和堆区:
在通常情况下,值类型和引用类型在内存中的分配如下: