1. 指针和基本类型的介绍。
1) 基本数据类型,变量存的就是值,也叫值类型。
2) 获取变量的地址用&,比如: var num int, 获取 num 的地址用&num
。
package main
import (
"fmt"
)
func main() {
num := 10
fmt.Println("num的地址=",&num)//num的地址= 0xc000064080
}
3) 指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值。
package main
import (
"fmt"
)
func main() {
var num int = 10
fmt.Println("num的地址=",&num)//num的地址= 0xc000064080
//声明一个*int类型的指针变量。并且赋值为&num(num的地址)
var pnum *int = &num
fmt.Printf("pnum变量的值=%v \n",pnum)//pnum变量的值=0xc000064080
fmt.Printf("pnum变量自己的地址=%v \n",&pnum)//pnum变量的地址=0xc00008a020
fmt.Printf("pnum指针指向的值=%v \n",*pnum)//pnum指针指向的值=10
}
上面的var pnum *int = &num
表示了下面几个意思:
- 声明了指针变量pnum,pnum变量的类型是 *int 。
- 变量pnum 的值是num变量的地址# 。
- pnum变量自己的地址是&pnum。
4) 获取指针类型所指向的值,使用:*,比如:var pnum *int = &num
, 使用*pnum
获取 punm指针指向的值。
fmt.Printf("pnum指针指向的值=%v \n",*pnum)//pnum指针指向的值=10
5)通过指针修改原来变量的值。
package main
import (
"fmt"
)
func main() {
var num int = 10
var pnum *int = &num
//改变指针指向的值。也改变了num的值。*pnum=num的值
*pnum = 99
//输出:pnum指针指向的值=99,num的值=99
fmt.Printf("pnum指针指向的值=%v,num的值=%v",*pnum,num)
}
原来变量num的值是10,通过指针修改*pnum = 99,num的值变成了99。
2. 指针的使用细节
1) 值类型,都有对应的指针类型, 形式为 *数据类型,比如: int 的对应的指针就是 *int, float32 对应的指针类型就是 *float32, 依次类推。
2) 值类型包括:基本数据类型 int 系列, float 系列, bool, string 、数组和结构体 struct。
3. 值类型和引用类型。
常见类型:
1) 值类型:基本数据类型 int 系列, float 系列, bool, string 、数组和结构体 struct。
2) 引用类型:指针、slice 切片、map、管道 chan、interface 等都是引用类型。
值类型:变量直接存储值,内存通常在栈中分配;引用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据(值),内存通常在堆。