1:Go是一门编译型语言,Go语言的工具链将源代码和其依赖一起打包(静态编译),生成机器的本地指令。
2:假如你没有在代码里import需要用到的package,程序将无法编译通过,同时当你import了没有用到的package,也会无法编译通过(译注:Go语言编译过程没有警告信息,争议特性之一)。
3:Go语言是一门不需要分号作为语句或者声明结束的语言,除非要在一行中将多个语句隔开。在编译时,编译器会主动在一些特定的符号(译注:比如行末尾是:一个标识符、一个整数、浮点数、虚数、字符或字符串、关键字break、continue、fallthrough或return中的一个、运算符和分隔符++、--、)、]或}中的一个)后添加分号,所以在哪里加分号合适是取决于Go语言代码的。
例如:在Go语言中的函数声明和 { 大括号必须在同一行;而在x + y这样的表达式中,在+号后换行可以(以+结尾的话不会被插入分号分隔符),但是在+号前换行则会有问题(以x结尾的话则会被分号分隔符,从而导致编译错误)。
Go语言在代码格式上采取了很强硬的态度。gofmt工具会将你的代码格式化为标准格式(译注:这个格式化工具没有任何可以调整代码格式的参数,Go语言就是这么任性)。
4:变量可以在声明期间直接进行初始化。如果没有显式初始化,Go语言会隐式地给这些未初始化的变量赋予对应其具体类型的零值,比如数值类型就是0,字符串类型就是空字符串""。
5:自增表达式i++会为i加上1;这和i += 1以及i = i + 1都是等价的。对应的还有i--是给i减去1。这些在Go语言里是语句,而不像C系的其它语言里是表达式。所以在Go语言里j = i++是非法的,而且++和--都只能放在变量名后面,因此--i也是非法的。
6:map是Go语言内置的key/value型数据结构,这个数据结构能够提供常数时间的存取操作。key支持任意数据类型,只要该类型能够用==运算符来进行比较,而value类型的可选范围就更广了,基本上什么类型都可以。
对map进行range循环时,其迭代顺序是不确定的,从实践来看,很可能每次运行都会有不一样的结果(译注:这是Go语言的设计者有意为之的,因为其底层实现不保证插入顺序和遍历顺序一致,也希望程序员不要依赖遍历时的顺序,所以干脆直接在遍历的时候做了随机化处理,醉了。补充:好像说随机序可以防止某种类型的攻击,虽然不太明白,但是感觉还蛮厉害的),来避免程序员在业务中依赖遍历时的顺序。
7:在Go语言里,函数和包级别的变量可以以任意的顺序被声明,并不影响其被调用。(译注:最好还是遵循一定的规范)
http://docs.ruanjiadeng.com/gopl-zh/ch1/ch1.html