go语言中那样让你吃惊的东西

本文面向golang的新手,第一次接触golang时可能会吃惊的地方

1. 以大小写开头来决定一个声明是包内可见,还是包外可见

如果一个常量/变量/类型/函数 它的名称是小写字母开头,则它是一个内部的,只能在同一个包内访问。
反之它是导出到外部的。

~/go/src/a.go

package a
import “b”

var name = b.lower // error
var name = b.Upper // correct

~/go/src/b.go

package b

const lower = “lower”
const Upper = “Upper”

2. 函数支持多返回值。

 resp, err := http.Get(url)

对于那些将运行失败看作是预期结果的函数,它们会返回一个额外的返回值,通常是最后一个,来传递错误信息。如果导致失败的原因只有一个,额外的返回值可以是一个布尔值,通常被命名为ok

导致失败的原因不止一种,尤其是对I/O操作而言,用户需要了解更多的错误信息。因此,额外的返回值不再是简单的布尔类型,而是error类型

io包保证任何由文件结束引起的读取失败都返回同一个错误——io.EOF,

3. 示例函数

go中Example开头的函数都是示例函数,示例函数要被编译以检测程序是否有问题,示例也会被go放到doc中

4. set

set是用map来实现的 map[string]bool
也可用bitmap来做
示例用bitmap实现整数集

具体实现

5. Package

本来go的模块也比较神奇,所有新建的工程都要放到GOPATH/src下面,不能随便找个目录就创建,但后来发现1.11之后的go mod还比较正常,好用。

6. 测试

没有断言,全是手动比较,然后用t.Error("xxx")自己写测试和你期望不一样的地方,书上给的解译是这样的:

许多Go语言新人会惊异于Go语言极简的测试框架。很多其它语言的测试框架都提供了识别测试函数的机制(通常使用反射或元数据),通过设置一些“setup”和“teardown”的钩子函数来执行测试用例运行
的初始化和之后的清理操作,同时测试工具箱还提供了很多类似assert断言、值比较函数、格式化输出错误信息和停止一个失败的测试等辅助函数(通常使用异常机制)。虽然这些机制可以使得测试非常
简洁,但是测试输出的日志却会像火星文一般难以理解。此外,虽然测试最终也会输出PASS或FAIL的报告,但是它们提供的信息格式却非常不利于代码维护者快速定位问题,因为失败信息的具体含义非
常隐晦,比如“assert: 0 == 1”或成页的海量跟踪日志。

Go语言的测试风格则形成鲜明对比。它期望测试者自己完成大部分的工作,定义函数避免重复,就像普通编程那样。编写测试并不是一个机械的填空过程;一个测试也有自己的接口,尽管它的维护者也
是测试仅有的一个用户。一个好的测试不应该引发其他无关的错误信息,它只要清晰简洁地描述问题的症状即可,有时候可能还需要一些上下文信息。在理想情况下,维护者可以在不看代码的情况下就能
根据错误信息定位错误产生的原因。一个好的测试不应该在遇到一点小错误时就立刻退出测试,它应该尝试报告更多的相关的错误信息,因为我们可能从多个失败测试的模式中发现错误产生的规律。

你可能感兴趣的:(go语言中那样让你吃惊的东西)