最近在看雨痕的《Go语言学习笔记》,在第六章关于方法集的规则的介绍中,有一个示例,代码如下:

运行之后发现没有输出结果:

代码本身没有报错,又一次仔细检查了一下我的代码和书中的完全相同,没有问题,但为什么没有输出正确的结果呢?
经过仔细排查,发现问题出现在第34行,t.NumMethod()方法的输出是0,没有找到任何方法

书中的是正常的,而我现在写的却得不到结果,而且也没有报错,为什么?
最后经过分析发现,最终的原因是由于go的版本造成的,书中go的代码是基于go1.6的,而我的是go1.15,再进一步查看关于NumMethod方法的文档说明会发现:
go1.6中

go1.15中

在go1.6中NumMethod方法会返回类型的方法集的方法的数量,这其中应包括可导出和不可导出的方法数量之和,而在go1.15中NumMethod方法会返回类型的方法集中的可导出的方法,不再包含不可导出的方法,所以t.NumMethod()才为0,因为书中的方法都是不可导出的。
找到原因之后,将上面示例中的方法都修改为可导出方法

再次运行,就可以正常输出结果了

总结,在调试代码时,有时语言的版本更新差异也是一个很重要的原因,当所有的方法都试过后,还是不能解决问题,不妨回过头来查看一下语言的版本差异,这也许是一个很不错的参考。