背景介绍
环境
- 操作系统
- 本机:MacOS 15
- 远程: 阿里云封装的centos
- go版本
- 本机:go1.21.0
- 远程:go1.14.12
- IDE:GoLand
- 辅助:ChatGPT 4o
1 | $ cat /etc/os-release |
环境准备
在本机MacOS15预览版上使用始终有问题,换用自有aliyun服务器,由于阿里云服务器代理不易设置,不好获取给的docker image,于是将本机环境的image打包后scp上去
1 | # 本机 |
必做一 channel 一页中,找出所有红线报错在 runtime 中的位置,使用 Go 1.14.12 版本
作业内容
Close nil
代码
1 | package main |
报错提示
1 | ❯ go run close_nil.go |
dlv分析
先用dlv启动
1 | dlv debug close_nil.go |
对main打断点 1
b main.main
运行到close(ch)前
1 | (dlv) c |
连续使用si命令进入
1 | > runtime.closechan() /usr/local/go/src/runtime/chan.go:342 (PC: 0x404d4a) |
可以看到在runtime/chan.go的342行有相关检查panic
Write close
代码
1 | package main |
报错提示
1 | # go run write_close.go |
dlv分析
先用前面类似方法找到函数入口
1 | (dlv) si |
持续n和si找到
1 | (dlv) n |
可以看到在runtime/chan.go的185行有相关检查panic
Close closed
代码
1 | package main |
报错提示
1 | # go run close_closed.go |
dlv分析
1 | (dlv) n |
可以看到在runtime/chan.go的346行有相关检查panic
选做:修复test case
作业内容
1 | package mapexpr |
运行结果
这个代码在go1.14.12中是无法运行的,由于 reflect.Value
类型没有 CanConvert
方法,以及
reflect.StructField
类型没有 IsExported
方法,这里改用本机的go1.21.0运行
1 | ❯ go test ch02/fix_test/rule_match_test.go |
报错分析
这里是因为表达式为大于,代码里只是判断是否相等,所以需要修改
代码修改
1 | // dfs |