- 基本数据类型,变量存的就是值,也叫值类型
- 获取变量的地址,用&,比如:
var num int
, 获取num
的地址:&num
- 指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值,比如:
var ptr *int = &num
- 获取指针类型所指向的值,使用:
*
,比如:var ptr *int
, 使用*ptr
获取ptr 指向的值
package main
import(
"fmt"
//"strconv"
)
//演示string转基本类型
func main(){
var i int = 10
fmt.Println("i 的内存地址=",&i)
var ptr *int = &i
//ptr是个指针变量
fmt.Println("ptr指向的内存地址是(本身的值)=",ptr)
fmt.Printf("ptr自己的内存地址是%v\n",&ptr)
fmt.Printf("ptr的存的值(地址)指向的值是多少%v\n",*ptr)
}
image.png
指针的使用细节
- 值类型,都有对应的指针类型, 形式为 *数据类型,比如 int 的对应的指针就是
*int, float32
对应的指针类型就是*float32
, 依次类推。 - 值类型包括:
基本数据类型, int 系列, float 系列, bool, string, 数组, 结构体(struct)
值类型和引用类型的说明
- 值类型:基本数据类型
int 系列, float 系列, bool, string 、数组和结构体
- 引用类型:
指针、slice 切片、map、管道 chan、interface
等都是引用
值类型和引用类型的使用特点
-
值类型:变量直接存储值,内存通常在
栈
中分配示
image.png -
引用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据(值),内存通常在
堆
上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,由GC
来回收
image.png -
内存的
堆
和栈
的示意图
m