1、基本数据类型,变量存的就是值,也叫值类型。
2、获取变量 num 的地址,用 &num
var num int = 10
// 获取num的地址,&num
fmt.Println(i, &i) // 10 0xc000014088
3、指针类型,变量存的是一个地址,这个地址指向的空间存的才是值
获取指针指向的值, 用 *ptr
var num int = 10
var ptr *int = &num // ptr是一个指针变量, *int 表示指针类型, ptr本身的值是&num
fmt.Println(num, &num) // 10 0xc0000aa058
fmt.Printf("%T %v %v \n", ptr, ptr, &ptr) // *int 0xc0000aa058 0xc0000ce018
// 获取指针类型所指向的值, 用 *ptr
fmt.Printf("%T %v", *ptr, ptr) // int 0xc000014088
// 通过指针地址修改存储的值
var num int = 10
var ptr *int = &num // ptr表示变量num的地址
*ptr = 9 // 把指针指向的值修改成9, num值会发生变化
fmt.Printf("%T %v \n", ptr, ptr) // *int 0xc000014088
fmt.Printf("%T %v", num, num) // int 9
// 错误写法, 类型不匹配
var n int = 300
var ptr2 *float32 = &n // cannot use &n (value of type *int) as *float32 value in variable
// 正确的写法:
var ptr2 *int = &n // 类型匹配
// 练习
var a int = 300
var b int = 400
var ptr3 *int = &a
*ptr3 = 100 // a 100
ptr3 = &b
*ptr3 = 200 // b 200
fmt.Printf("%v %v %v\n", a, b, *ptr3) // 100 200 200