编辑器换成了 goland,看源码极其方便。就是快捷键又要适应一会儿。
今天开始看 《go 程序设计语言》,别名《go 语言圣经》。
$ ./gobible --type=书籍 --name=go 语言圣经(一)--chapter=program structure
虽然 go 一直说自己很简洁,去掉很多多余的语法。但是又舍不得语法糖,于是声明一个变量出现了 4 种用法,这里假设我们要声明一个叫 s
的 string
类型的变量:
var s string
var s = ""
s := ""
var s string = ""
var a float64 = 100
这种用法的时候,就有用处了。指针没什么好说的,需要说的是二级指针,但是因为某种原因我写在另一篇文章里了:
我的。
和 js 一模一样,甚至也一样可以使用无关键字的大括号。
甚至也是用的作用域链。
但不是完全没得说,因为 go 里的 for,if 等有一个隐式作用域:
for i := 0; i < 10; i++ { fmt.println(i) i := 0 fmt.println(i) } // 你觉得会无限循环吗?其实不会 // 总共会循环 10 次 // 第一个 print 会依次 print 0,1,2...9 // 第二个 print 会打印 10 个 0
为什么,因为 for 的初始化语句块其实也是一个作用域,你说我知道啊,和 for 里的语句在同一个作用域嘛,所以可以访问。
但是不是,这就是 go 的奇妙之处,其实整个代码类似于这样一个结构:
for { (i := 0; i < 10; i++ ) { fmt.println(i) i := 0 fmt.println(i) } }
也就是说,大括号里的语句块和初始化 i 的语句块并不是在同一个作用域,而是嵌套的,所以可以使用 i,但是却不能改变外面的 i。所以这个循环必定是循环 10 次。
这个语法是好是坏见仁见智了,我有时候还是会想在内部改变 i 从而跳过几个循环的。