基本数据类型 (int, float, string等),变量存的是值,用 取地址符& 可以获取变量的地址:
package main
import (
"fmt"
)
func main() {
// 基本数据类型,变量就是值
var i int = 10
// 输出 i 在内存中的地址
fmt.Println("i 的地址是 ", &i)
}
变量 i 的地址为:
一、指针类型
对于指针类型,指针变量存的是一个地址,该地址指向的空间存的才是值,用 “ * ” 获取指针所指向的值:
package main
import (
"fmt"
)
func main() {
// 基本数据类型,变量就是值
var i int = 10
// 输出 i 在内存中的地址
fmt.Println("i 的地址是 ", &i)
// 指针类型
// 1. ptr 是一个指针变量
// 2. ptr 的类型是 *int
// 3. ptr 的值是 &i
// 4. ptr 指向的值为 *ptr
var ptr *int = &i
fmt.Printf("ptr = %v", ptr)
fmt.Println("ptr 指向的值为 ", *ptr)
}
输出结果为:
1. 示例
案例:
- 获取一个int变量num的地址,并显示到终端;
- 将num的地址赋给指针ptr,通过ptr修改num的值。
package main
import (
"fmt"
)
func main() {
// 1. 获取一个int变量num的地址,并显示到终端
var num int = 520
fmt.Println("num = ", num, ", num 的地址是 ", &num)
// 2. 将num的地址赋给指针ptr,通过ptr修改num的值
var ptr *int = &num
*ptr = 1314
fmt.Println("修改之后的值为 num = ", *ptr)
}
输出结果为:
2. 使用细节
1、 每个值类型都有对应的指针类型,形式为数据类型;
2、 值类型包括: 基本数据类型int系列,float系列,bool,string,数组,结构体struct。
二、值类型和引用类型的使用特点
1. 值类型
值类型包括:基本数据类型 int 系列,float 系列,bool,string,数组,结构体struct。
特点: 变量直接存储值 ,内存通常在栈中分配;
2. 引用类型
引用类型包括:指针,slice切片,map,管道chan,interface等。
特点:变量存储的是一个地址 ,该地址对应的空间中存储的才是值,内存通常在堆上分配,没有任何变量引用该地址时,对应的数据空间就成为一个垃圾,由GC回收。