1、基本数据类型,变量存的就是值,也叫值类型。
    2、获取变量 num 的地址,用 &num

    1. var num int = 10
    2. // 获取num的地址,&num
    3. fmt.Println(i, &i) // 10 0xc000014088

    3、指针类型,变量存的是一个地址,这个地址指向的空间存的才是值
    获取指针指向的值, 用 *ptr

    1. var num int = 10
    2. var ptr *int = &num // ptr是一个指针变量, *int 表示指针类型, ptr本身的值是&num
    3. fmt.Println(num, &num) // 10 0xc0000aa058
    4. fmt.Printf("%T %v %v \n", ptr, ptr, &ptr) // *int 0xc0000aa058 0xc0000ce018
    5. // 获取指针类型所指向的值, 用 *ptr
    6. fmt.Printf("%T %v", *ptr, ptr) // int 0xc000014088

    image.png

    1. // 通过指针地址修改存储的值
    2. var num int = 10
    3. var ptr *int = &num // ptr表示变量num的地址
    4. *ptr = 9 // 把指针指向的值修改成9, num值会发生变化
    5. fmt.Printf("%T %v \n", ptr, ptr) // *int 0xc000014088
    6. fmt.Printf("%T %v", num, num) // int 9
    7. // 错误写法, 类型不匹配
    8. var n int = 300
    9. var ptr2 *float32 = &n // cannot use &n (value of type *int) as *float32 value in variable
    10. // 正确的写法:
    11. var ptr2 *int = &n // 类型匹配
    12. // 练习
    13. var a int = 300
    14. var b int = 400
    15. var ptr3 *int = &a
    16. *ptr3 = 100 // a 100
    17. ptr3 = &b
    18. *ptr3 = 200 // b 200
    19. fmt.Printf("%v %v %v\n", a, b, *ptr3) // 100 200 200