第09讲 Go指针说明(二)
本讲义根据视频实际讲解内容整理
一、本讲概述
本讲是指针内容的续篇,通过代码实操演示了如何声明变量、用取地址运算符 & 获取内存地址,并对比了 Go(有指针)和 Python(无指针)在变量内存地址行为上的差异。
二、实操演示:获取变量内存地址
2.1 声明变量并取地址
老师在课堂上演示了以下代码:
Go
package main
import "fmt"
func main() {
var a uint = 10 // 声明一个无符号整型变量
var b = &a // b 存储 a 的内存地址
fmt.Println(b) // 输出类似 0xc00001a0b0
}
2.2 关于 0x 前缀
老师特别讲解了输出结果中 0x 的含义:
0x代表十六进制(Hexadecimal)- 这不是二进制的 0 和 1,而是十六进制表示法
- 内存地址通常用十六进制表示,便于阅读
"0X代表的就是16进制,这就是 A 在内存中的地址。"
三、内存地址不变,值可变
3.1 关键演示
老师演示了一个重要概念:修改变量的值,内存地址不会变。
Go
package main
import "fmt"
func main() {
var a uint = 10
var b = &a
fmt.Println("a的地址:", b) // 打印地址
fmt.Println("a的值:", a) // 10
a = 20 // 修改 a 的值
fmt.Println("修改后a的地址:", b) // 地址不变!
fmt.Println("修改后a的值:", a) // 20
}
3.2 核心结论
"内存地址不变,只是值变了。"
- 变量声明后,其内存地址就固定了
- 修改变量的值,只是改变了该地址上存储的数据
- 其他通过指针引用该地址的地方,看到的也是更新后的值(共享)
四、Go vs Python:指针的对比
4.1 Python 没有指针
老师为了加深理解,对比演示了 Python 的行为:
Python
# Python 代码
a = 10
a = 20
- Python 中没有指针的概念
- 当
a = 20时,实际上是创建了一个新的内存空间,a指向了新地址 - 原来的
10的内存空间会被垃圾回收
4.2 Go 有指针
Go
// Go 代码
var a int = 10
a = 20 // 值变了,但地址不变
- Go 中修改变量值时,内存地址保持不变
- 只是在同一块内存上更新了数据
4.3 对比总结
| 特性 | Go | Python |
|---|---|---|
| 指针 | 有 | 无 |
| 变量重新赋值 | 地址不变,值更新 | 创建新对象,地址变化 |
| 内存共享 | 通过指针共享同一地址 | 无法直接共享内存地址 |
"Python 没有指针,调整数值时地址绝对不一样。但是 Go 的地址一样,这就是指针的区别。"
五、小结
本讲通过实际代码对比,加深了对指针的理解:
- 取地址:用
&运算符获取变量的内存地址,结果为0x开头的十六进制 - 地址不变性:变量值改变时,内存地址保持不变
- Go 与 Python 对比:Go 有指针,修改变量时地址不变;Python 无指针,重新赋值时地址会变化
老师提到指针是一个需要详细讲解的话题,后续会继续深入。