一段示例代码
| package main |
| |
| type info struct { |
| Name string |
| Hp uint32 |
| Mp uint32 |
| } |
| |
| |
| func (my info) PrintName() { |
| println(my.Name) |
| println(my.Name) |
| } |
| |
| |
| func (my *info) PrintName2() { |
| println(my.Name) |
| println(my.Name) |
| } |
| |
| func main() { |
| var i = info{ |
| Name: "abc", |
| Hp: 1, |
| Mp: 2, |
| } |
| |
| (&i).PrintName2() |
| i.PrintName() |
| } |
如果你需要在方法中修改接收者,则必须使用指针方法。因为值方法是拷贝的一份副本
debug
| |
| |
| 在28行打个断点 |
| (dlv) b main.go:28 |
| Breakpoint 1 set at 0x45b6a7 for main.main() ./main.go:28 |
| |
| |
| 执行到下一个断点 |
| (dlv) c |
| > main.main() ./main.go:28 (hits goroutine(1):1 total:1) (PC: 0x45b6a7) |
| 23: Name: "abc", |
| 24: Hp: 1, |
| 25: Mp: 2, |
| 26: } |
| 27: |
| => 28: (&i).PrintName2() |
| 29: i.PrintName() |
| 30: } |
| |
| 查看i的地址 |
| (dlv) print &i |
| (*main.info)(0xc00004e758) |
| |
| |
| 查看指针下的数据: 0x0000000000467a10 Name的数据地址, 0x0000000000000003 Name的长度, 0x0000000200000001 四字节的Hp和Mp |
| (dlv) x -len 3 -size 8 -x 0xc00004e758 |
| 0xc00004e758: 0x0000000000467a10 0x0000000000000003 0x0000000200000001 |
| |
| 查看Name的数据 |
| (dlv) x -len 3 -x 0x0000000000467a10 |
| 0x467a10: 0x61 0x62 0x63 |
| |
| 三次步进到 PrintName2 函数 |
| (dlv) s |
| (dlv) s |
| (dlv) s |
| (dlv) ls |
| > main.(*info).PrintName2() ./main.go:18 (PC: 0x45b5ef) |
| 13: } |
| 14: |
| 15: // 指针方法 |
| 16: func (my *info) PrintName2() { |
| 17: println(my.Name) |
| => 18: println(my.Name) |
| 19: } |
| 20: |
| 21: func main() { |
| 22: var i = info{ |
| 23: Name: "abc", |
| |
| |
| 查看 my 的地址 |
| (dlv) print &my |
| (**main.info)(0xc00004e740) |
| |
| |
| 查看 my 地址下的数据 0x000000c00004e758 是指向 i 数据的指针 |
| (dlv) x -len 2 -size 8 0xc00004e740 |
| 0xc00004e740: 0x000000c00004e758 0x000000c00004e701 |
| |
| |
| 跳出函数 |
| (dlv) so |
| abc |
| > main.main() ./main.go:29 (PC: 0x45b6b1) |
| Values returned: |
| |
| 24: Hp: 1, |
| 25: Mp: 2, |
| 26: } |
| 27: |
| 28: (&i).PrintName2() |
| => 29: i.PrintName() |
| 30: } |
| |
| |
| 三次步进到 PrintName 函数 |
| (dlv) s |
| (dlv) s |
| (dlv) s |
| (dlv) ls |
| > main.info.PrintName() ./main.go:12 (PC: 0x45b51e) |
| 7: } |
| 8: |
| 9: // 值方法 |
| 10: func (my info) PrintName() { |
| 11: println(my.Name) |
| => 12: println(my.Name) |
| 13: } |
| 14: |
| 15: // 指针方法 |
| 16: func (my *info) PrintName2() { |
| 17: println(my.Name) |
| |
| 查看 my 的地址 |
| (dlv) print &my |
| (*main.info)(0xc00004e740) |
| |
| 查看 my 地址下的数据,数据被拷贝了一份在这里 |
| (dlv) x -len 3 -size 8 -x 0xc00004e740 |
| 0xc00004e740: 0x0000000000467a10 0x0000000000000003 0x0000000200000001 |
| |
| |
| 退出调试 |
| (dlv) exit |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决