前端人员现在都是号称全栈工程师,前端后端都要抓都要上,虽然这很好,号子喊的也有点亮,但是JS作为了一个前端语言,硬要拿来做后端,或者用来做其他方面编程,还是是有些局限。这时候不妨换个思路,学一下真正的后端语言未尝不是一个好方法。本文虫虫就来给JS开发人员介绍Golang语言,以及JS人员如何开始写Golang。
本文纯属技术探讨,不讨论语言纷争,反正各种地方已经争的已经太多了,也没个统一的结果。如果你懂一些JavaScript/TypeScript开并且想尝试下Golang语言,那本文就是写给你的。
一些相似点
与JS一样,Golang使用垃圾收集器。我们也不需进行任何内存分配/处置。
函数式开发是Golang重要组成部分。
变量和函数具有作用范围。
Golang函数中也可使用闭包。
最后,Golang是一种非常简练的语言,和JS一样,你可以定义变量,结构,函数,执行 for循环 、if语句。Golang介于C语言和JavaScript之间,具备两者的一些通性。
两者差异
两个语言的差异还是相当明显的,我们在此只列出一些JS开发人员最关注的一些内容,其他内容要参考相关官方文档。
首先,Golang是静态类型语言,需要在编译时检测类型错误。
双方垃圾收集器除了上面提到的相同点外,但是两者还有很大差异的:golang 的GC非常快,没有滞后。
JavaScript运行基于一个主线程(事件循环)和其他几个执行外部IO的线程。在Golang中,并发协程goroutine是强项,对多线程开发是他优势(当然Node.js的并发,基于async/await,也是不容小觑的)。
Golang语言使用指针。为了能够正确地执行GC并避免读/写内存不足,Go指针不允许在指针上做任何计算。你不能像C里一样对指针做类似于p++等的操作。
Golang比JavaScript更快!基于不同的基准测试,有些情况下可以快10倍。
Golang更适合服务器,而JS已经到处都有了。
golang不支持OOP
Golang使用结构,不支持面向对象。这在oo大行其道的今天,可以说是一股清流。当然oo如果不讲形式,光实现其思想,比如继承,多态等话,golang也是有方法可以实现的。
快捷语法
在Golang中,语法形式都用快捷方式。它几乎感觉好像可以用快捷写法来做Golang开发。
// 一般形式
var chongchong Int = 1024
// 短链接形式
chongchon := 1024
刚开始,可能不好适应,但是如果你坚持写Golang语言,最终你可能会适应并且最终会喜欢上它。
lodash的Map/Reduce
Golang是强类型的,而且不支持泛型,所以很多时候做数据处理可能有点费劲,比如对json类型转化,在golang中就非常费劲,要写大量的条件判断才能实现。同样的你习惯于使用的lodash库的map/reduce函数,你也没法子在 golang中找到对应的用法。好消息是,相关的计划已经在Golang社区提出,会在将来版本中推出。
包
很多人安装Go并想创建第一个项目时,会创建一个文件夹并将所有代码放在那里,构建它,并运行。这不是Golang典型的运作方式。你所有项目都应位于同一个全局src文件夹下,位于项目特有的文件夹下,通常是Github路径(例如:~/go/src/github/bollwarm/gh-Template)。这种方法存在许多问题,例如项目的依赖关系在同一个src文件夹下,版本成为一个大问题。
Golang确实支持供代理文件夹(类似于JS中的node_modules),但它将获取主分支…
有许多尝试来解决这个问题,但是知道目前Go中的依赖关系还是有点费劲,需要改进。
测试
Golang鼓励测试,以至于当编译器检测到测试文件时(通过文件名_test.go),它会在你代码build是时候会自动排除测试代码。
语法法
首先我们先来介绍下golang基本语法。
基本规则
代码行结束不用分号。
数组中的最后一个元素后面也必须带”,”。
var cc = [3]int{
1,
2,
3,
}
if语句中的{ 在一行,不能换行。
public/private属性由其变量名称的第一个字母是否大写来定义。
var CCisPublic = “可以从变量作用域范围外访问”
var ccprivateValue = “只能在变量包范范围内访问”
基本类型
//常见类型
var num int = 5
var pi float32 = 3.14
var name string =”Gil”
var isActive bool = true
//没有初始化
var num int // 值为0
var pi float32 // 值为0
var name string // 值为空,””
var isActive bool // 值为false
var var person Person //值为 nil
var a, b, c = true, “Hi”, 0.5 //多个变量同时初始化
num := 5 // `var` 省略了,类型由初始化的值自动推断
循环结构
我们最常见的for循环
for i := 0; i < 100; i++ {
sum += i
}
// while语句
for sum < 1000 {
sum += sum
}
// 无限制loop,慎用
for {
}
分支控制
注意分支结构中,不需要写在括弧中:
if age < 18 {
return true
} else {
return false
}
switch结构不需要增加` break `:
switch state {
case “ACTIVE” :
de activate ()
case “INACTIVE”:
activate()
default:
fmt.Printf(“Unknown state”)
}
函数
简单的函数结构为:
func add(a int, b int) int {
return a + b
}
// 返回多个值
func swap(a, b int) (int, int) {
return b, a
}
命名返回值:
func namedResult(input int) (output int) {
output = 42
return
}
我们举个实例rectProps函数,它接受一个矩形的长和宽,并返回该矩形的面积和周长:
当然,这而只是基本语法的快速预览,还有很多高级功能,比如channes, 结构, 和接口等,以后有机会我们再来论述,今天就权当一个开头把。