前端JS开发人转Golang初步

前端人员现在都是号称全栈工程师,前端后端都要抓都要上,虽然这很好,号子喊的也有点亮,但是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" :

deactivate()

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, 结构, 和接口等,以后有机会我们再来论述,今天就权当一个开头把。

举报
评论 0