前言
回学校的这么长时间竟然没有写过超过300行的代码。这日子实在是太颓废了。
SICP 暂时看不下去,那么多题静不下心。
可是最近是真的无聊就说新学一门语言吧,刚好公司在用 Go,而且大家都说 Go 语言不错,我就准备学了一下。
变量
现在的新语言似乎都不大愿意写冗长的变量声明了。
// 显示声明一个变量的类型
var foo int = 1
// 自动推导
foo := 1
大部分情况下 foo
:= 1
的这种短语法就挺好用的
不过我个人对于这个语法还是不喜欢,因为。。。 :
和 =
在键盘上离得好远啊!
js 因为是弱类型的,不需要声明类型。好像会舒服一些。
let a = 1
循环
循环贼灵活,全程都是 for
来做的。
for {
// do some stuff
}
for variable < 1 {
variable++
}
for i := 0; i < 1 ; i++ {
// do some stuff
}
上面的分别是死循环,条件判定,完整循环。语法就这个样子,对应的js类似于下面的:
while(1) {
// 第一个 for
}
while (variable < 1) {
// 第二个 for
}
for (let i = 0; i < 1; i++) {
// 第三个 for
}
现在就好理解很多了。
还有遍历map, slice什么的:
for key, value := range someMap {
// do some stuff
}
对应的 js 是这个样子
for (let key in someMap) {
let value = someMap[key]
// do some stuff
}
结构体
结构体和 C 语言很像
type Foo struct {
x int
y int
}
结构体可以挂在方法。
func (foo *Foo) Print() {
fmt.Println("foo")
}
常写js的你肯定想到了什么对吧,这和原型链好像啊!
let Foo = function() {}
Foo.prototype.Print = function() {
console.log('foo')
}
简直不要太亲切!
map
键值对这样的数据在Go中怎么实现是我初学的时候想问的。
foo := map[string]bool{
"hello": true,
"world": false
}
类似于js中的:
let foo = {
"hello": true,
"world": false
}
是不是特别的亲切~
slice
可变数组,在 Go 中叫“切片”
反正有用就是了。
foo := []string{"hello", "world"}
类似于 js 中的
let foo = ['hello', 'world']
defer
这个关键词可以自动延迟执行。
比如打开一个文件,可以立即写一个 defer 以防后面忘记
file, err := os.Open("file.txt")
defer file.Close()
js里似乎没有这么牛逼的功能。有点儿叼的。
Function
定义函数很多种方法。
虽说 Go 语言并不是一门函数式语言,但是却也实现了很多函数式语法:
比如:
someFunc := func() (func() int) {
// do some stuff
return func() {
// return a function
return 1
}
}
相似的是
let someFunc = () => () => 1
只是 Go 语言是强类型的,所以要在函数声明的时候加上参数列表
对了,首字母大写的表示是暴露出的接口,小字母的是非暴露的。就是 public 和 private 的区别。
那么,自执行函数呢,Go 也有!
foo := func() int {
return 1
}()
对应的 js 是这样的:
let foo = (function() {
return 1
})()
Go 还有叼叼的多返回值,到这里我就特别想Node也有。
func Hello() (result string, status int) {
return "hello world", 0
}
res, status := Hello()
相信我,你会爱上它的
还有 Go 的独有的,牛逼的 go
关键字:
names := []string{"Keyle", "Tom", "AnnatarHe"}
for _, v := range names {
go func() {
fmt.Printf("Hello, %s", v)
}
}
go
会放到另一个Goroutine中执行,就算不明白什么意思,但是我也觉得一名合格的前端也应该立刻觉得哪里不对。
哈哈,是的。和一些著名的js面试题一样,因为进行的很快,所以最后只会输出“AnnatarHe”,我猜你看到这里应该会改了哦~
go func(name) {
fmt.Printf("Hello, %s", name)
}(v)
附上烂大街的js面试题:
for (var index = 0; index < 5; index++) {
setTimeout(function() {
console.log(index)
}, 500)
}
End
好了,后面的 Goroutine 和 channel 我还没有完全看懂,毕竟只学了不到一周。
只是觉得和js很像,所以记一下自己所学。
一定要注意,文中的表述并不是完全准确地,如果对 Go 语言感兴趣请去看专业的书籍和官方文档哦。
有疑问加站长微信联系(非本文作者)