1.4.3 代码的出错提示及调试
程序员在代码编写的过程中遇到出错的现象是必然的,关键在于如何解决出错问题。这就涉及出错提示及调试。
1.出错提示
这里用“Hello三酷猫”案例演示出错过程。在图1.20中去掉第7行的“}”,GoLand会马上给出代码语法出错提示。
•提示一,在GoLand中,若检测到语法错误,则会以波浪线的形式在代码出现错误的地方标记出来(见图1.20中的①处)。
•提示二,代码编辑界面右上角出现红色感叹号加数字(见图1.20中的②处)。
•提示三,在②处右侧单击“^”按钮,在“Problems”视图中的“Current File”选项卡中会显示出错提示(见图1.20中的③处)。
仔细观察,除了准确的英文提示信息,该出错提示还指出了出错行“:7”(在第7行出错)。这里的“Empty element parsed in 'Statements' at offset 81:7”提示“在语法的第7行81个字符处解析到空元素”,这意味着正常语法应该要加“}”,少了一个右花括号。
图1.20 编写代码时的出错提示
注意
学会阅读出错提示是程序员的一项基本功。读者应该日积月累,熟悉常见出错提示中的英文单词。学习技巧:可以借助百度等翻译工具,遇到一个记录一个。
前面提示的出错信息都是在代码编写过程中,GoLand通过智能感应直接给出的。这也证明了GoLand是一款优秀的代码编辑工具。
当单击三角形按钮(类似于播放器中的播放键,见图1.21中框住的位置)编译运行代码时,也会给出出错提示。如图1.21所示,在下面的执行结果列表框里显示“.\errorTest.go:7:1:syntax error:unexpected EOF,expecting}”出错提示信息。其中,“go:7:1”表示第7行的第1列存在错误;“syntax error:unexpected EOF”表示在代码文件中意外结束的语法错误;“expecting}”表示少了右花括号。
图1.21 编译运行代码时的出错提示
显然,编译运行时给出的出错提示内容更加精准。在发现问题后,只需要有针对性地进行代码修改即可。
2.调试
对于复杂的代码,我们只通过简单观察不容易发现存在的问题,需要借助专业调试工具或技巧来解决问题。
1)利用GoLand自带Debug调试工具来调试程序
在图1.22所示的代码编辑框中,定位到第5行代码,双击代码行数旁的灰色空白处,会出现棕红色的圆点。该圆点叫作“断点”,表示在单击Debug调试按钮(见图1.22中的①处)时,从第5行开始进行断点调试。
图1.22 Debug调试界面
同时,图1.22下方会出现Debug(调试)视图,在Debugger选项卡中提供了几个调试按钮(见图1.22中的②处)。
(Step Over F8):单步执行代码调试。单击一次该按钮,代码向下执行一行,并显示执行过程中的内容和变量值情况,方便程序员观察执行过程中发生的情况。
(Step Into F7):单步执行并进入函数体内执行。当存在函数等调用模块代码时,单击该按钮将执行函数体内的相关代码。与“Step Over F8”的区别在于,后者调用函数时不执行函数体内的代码。
(Step Out Shift+F8):跳出函数体内执行,返回调用处继续向下执行一行。
(Run to Cursor Alt+F9):从当前断点处执行代码到下一个断点处(若设置了多个断点)。在当前断点后面没有断点的情况下,把剩余代码执行完,并结束代码执行。
断点设置是双向的,若在该断点上再次双击,可以取消断点设置。
另外,该界面还提供了一些程序执行控制按钮,如程序执行过程的终止按钮(类似于播放器的停止播放键,见图1.22中的③处,在程序不执行时是灰色的)。
(Ctrl+F2):强制终止代码执行。当代码出现死循环等特殊情况时,非常有用。
2)调试技巧
复杂的算法可以利用fmt.Println()函数输出中间计算结果,有利于判断编程逻辑算法是否正确。
随着编程阅历越来越丰富,不同的程序员会总结出属于自己的调试技巧,这里仅起到“抛砖引玉”的作用。