Go语言的课程开设以来,同学们踊跃参与问答区的讨论,提出了很多高质量的问题。这里我总结了一些常见的问题,统一进行解答~希望同学们在提问题的时候,可以先看下常见问题总结,方便大家更高效、更及时的解决问题!
1、请问会不会有反射的内容呢
答:reflect我在本课程中故意没有安排。对初学者来说,reflect太强大太容易滥用。的确很多开源项目会用到,因为它们提供的是基础设施。而我们如果是做功能性的项目,就要尽量避免使用reflect。另一方面,如果我们觉得一定要用,那我们应该考虑下是否有开源的库已经为我们完成了这个需求。
2、问:我们在idea中运行时,发现panic的内容和正常输出的内容混在一起,如下图,这是为什么?
答:这是idea的原因。panic的内容是往stderr输出的,正常的输出时去到stdout。这是两个不同的输出目的地,idea在打印的时候有时会混在一起。使用命令行的话就不会。
3、问:老师推荐什么Go语言的包管理工具?
答:Go语言的包管理工具现在没有一到两个业界比较公认的,相反,这样的工具有很多个。这里有一篇比较的文章https://studygolang.com/articles/10523,以及一个统计https://github.com/blindpirate/report-of-build-tools-for-java-and-golang
那么我们如何推荐呢?我的建议是,首先,看你要依赖的包使用什么进行管理,那你也用什么。其次,根据自己的喜好,如果对某个工具有所了解,比如对gradle有所了解,那我们可以使用自己熟悉的。实在无从选择,我们选dep,虽然还不是正式版。
那么Go语言缺乏一个业界公认的包管理工具,是不是就不完整了呢,不是这样。包管理和语言,本身就是两个不同的项目。c/c++有make。java看似classpath是个很朴素的想法,你运行的时候告诉我类在哪里嘛,但实际上给人们也带来了很多痛苦,直到maven/gradle这样的方案。同样,python后来也才有了pip,anaconda等。我们看到依赖管理一般都滞后于语言本身。go语言现在也面临这样的情况。
4、问:我们运行gopm获取第三方包的时候,总是遇到网络不通,cannot find revision等各种错误
答:gopm目前的确处于挂掉的状态,我们只能采用https://www.golangtc.com/download/package里的方法进行手动下载。的确有些复杂,但是相信上了我的课后同学应该能够按照里面的步骤进行操作。
5、问:在Windows下,换行符是\r\n。老师的代码,比如在第12章读取迷宫内容,似乎只能正确处理\n的情况
答:Go语言的FScanf似乎有这样的bug。在Windows下,我们可以在读完一行内容后,加上fmt.Fscanln(file)来解决这个问题。这个bug目前处于open状态:https://github.com/golang/go/issues/23562
6、问:老师,我是跟着你一行一行敲的,可运行为啥还是不对呢?
答:既然是同学敲的,就是同学自己的代码。这里很可能在敲代码中隐藏了非常小的错误,但是又和我的代码非常相近,所以无法看出问题。这样的情况我们要尽量做到就好像没有我的代码,我们自己写了这些,然后来进行逻辑分析和排错。不到万不得已,大家不要去对比自己的代码和我的代码,因为很可能受到某种误导而无法看出问题来。另外,如果你已经能够访问我提供的标准代码,那我们可以运行一下,看看标准代码是否正确。如果正确的话,我们通过文件比较工具,而不是人肉检查,来看是否有不同。
7、问:如何查看本课程的代码,本课程ppt提供下载吗?
答:课程代码有两份,“项目栏”的代码为初始代码,购买课程后就可以下载。“同学栏”为最终代码,学习进度到40%后方可下载。因为涉及版权问题,所以ppt不提供下载。
8、问:我常看到你按一个快捷键,就能自动把表达式的值提取出来赋给变量。还能自动提取函数等。这些是什么快捷键。
答:我最常用的两个快捷键,一个叫Extract->Method,一个叫Extract->Variable,以及Rename。可以通过idea的配置里面,进到Keymap找到。
其中Extract->Variable最为有用。它可以选择表达式提取变量,也可以把函数调用后的返回值值赋给变量。