Go for JavaScript开发人员简介

玛丽娜·鲁丁斯基的横幅

JavaScript转到Go,我遇到了一些“ 抱怨?! 最终变成“时刻”的时刻, 哈哈,好吧! ”片刻。 更雄辩地说,如果您是JavaScript / TypeScript开发人员并考虑尝试Go,那么本文适合您。

Orbs (面向消费者应用程序的区块链)工作期间,我参与了TypeScript的参考实现工作-我从头开始实现了共识算法 。 最近,我们开始着手Go语言的参考实现。 我的任务是将共识算法移植到Go中-您可以在此处查看转换后的代码。

相似之处

  • 像JavaScript一样,Go使用垃圾收集器。 您不必进行任何内存分配/处置。
  • 功能在您的日常开发中起着重要的作用。
  • 变量和函数具有作用域。
  • 您可以在函数中使用闭包。
  • 毕竟,这是一种非常简单的语言,就像JavaScript一样,您可以定义变量,结构,函数并执行for循环和if语句。 我会说Go在C和JavaScript之间

(大)差异

除了以下列表之外,还有许多其他区别,但是我发现对于来自JavaScript背景的开发人员来说,这些是最有趣的。

  • Go是静态类型的,将在编译时检测类型错误
  • 我知道垃圾收集器在上面的“相似之处”中,但是在Go中有很大的不同:GC 令人惊讶 快速。 没有滞后!
  • JavaScript基于一个运行代码的主线程(事件循环)以及执行外部IO的其他多个线程。 在Go中,并发为王! 做好准备。 起初不容易掌握,但是一旦掌握,您将拥有强大的力量。 (世界正在发展到越来越多的核心)
  • 编写JavaScript并运行它非常有趣。 JavaScript被解释,并且代码在运行之前就被编译了,但是谁真正做到了呢? 如今,JavaScript工具链涉及许多代码分析工具,甚至包括Babel或TypeScript之类的编译。 如上所述,Go已编译。
  • Go正在使用指针。 是! 指针。 可是等等! 不要停止阅读。
    为了能够正确执行GC并避免读/写内存不足,Go指针不允许对指针进行任何算术运算。 您不能像在C中那样对指针执行p ++将其移至数组中的下一项。但是,您确实拥有指针的所有其他优点(参考)
  • Go比JavaScript ! 根据您的测量,它甚至可以快10倍
  • Go更适合服务器,而JavaScript无处不在

“哇!! 哈,好吧”

您应该了解的一件事是,Go 很有主见。 例如关于语法,在Go中,您必须{放在if语句的同一行。 否则会导致编译错误!

没有OOP

Go的构造方式使得不可能实现类,继承和多态性(或至少非常困难)。 开头是“ 我不喜欢那个! ”变成“ 嗯,也许那更好! 当我了解Go正在推动您使用合成而非继承时。

捷径

在Go中,有许多快捷方式。 几乎感觉到可以用更少的字符在Go中编写的任何内容。

// The long way
var age Int = 42
// The short way
age := 42

这会使您的学习曲线更加陡峭,但是如果坚持使用Go,最终(可能)您会喜欢它。

映射/缩小

Go是键入的,但没有泛型 。 这意味着您没有类似lodash的map / reduce函数。 这个“ Whaaat ”没有以“ haa ok ”结尾。
计划用于Go的未来版本。

配套

当我第一次安装Go并想要创建一个项目时,我以为我会创建一个文件夹,并将所有代码放在这里,构建它,然后运行...不。 Go通常不是这样操作的。 您的所有项目都应该在同一个全局src文件夹下,该文件夹对于您的项目是唯一的,通常是您的Github路径(例如: ~/go/src/github.com/gilamran/PBFT-Typescript

这种方法存在很多问题,例如项目的依赖项位于同一src文件夹下,而版本则成为一个大问题。

Golang确实支持vendor文件夹(类似于JavaScript中的node_modules ),但是它将获取master分支…

有很多尝试来解决这个问题,但是知道当前Go中的依赖可能很痛苦。

测验

Golang非常喜欢测试,因此当编译器检测到测试文件(文件名为_test.go )时,它将在构建时自动排除测试代码。

句法

在您深入之前,让我简要介绍一下我们的工作方式:

基本规则
  • 行不以分号结尾。
  • 阵列中的最后一个项目必须具备的,值了。
var arr = [3]int{
1,
2,
3,
}
  • { of of if is in同一行
  • public / private分别由名称的首字母是否大写定义。
var ThisIsPublic = "You can access this variable from outside"
var privateValue = "Accessible only inside the current package"
基本类型
// common types
var num int = 5
var pi float32 = 3.14
var name string = "Gil"
var isActive bool = true

// without initialisation
var num int // value is 0
var pi float32 // value is 0
var name string // value is ""
var isActive bool // value is false
var person Person // value is nil

// one liner
var one, two, three bool
var a, b, c = true, "Hi", 0.5 // you got the point

// short version with inference
num := 5 // `var` is omitted, and type is inffered
循环
// you should be familiar with this
for i := 0; i < 100; i++ {
sum += i
}
// while
for sum < 1000 {
sum += sum
}
// infinite loop
for {
}
流量控制
/// yep, no parenthesis
if age < 18 {
return true
} else {
return false
}
// switch no need to add `break`
switch state {
case "ACTIVE" :
deactivate()
case "INACTIVE":
activate()
default:
fmt.Printf("Unknown state")
}
功能
// simple function
func add(a int, b int) int {
return a + b
}
// multiple return values
func swap(a, b int) (int, int) {
return b, a
}
// named return values
func namedResult(input int) (output int) {
output = 0
.
.
.
output = 42
.
.
.
return
}

当然,这只是冰山一角。 还有许多其他高级功能,例如通道,结构和接口,但我将在以后的文章中介绍。

结论

Go非常有趣,非常快,并且具有出色的GC。 在谈论并发时,它确实很出色,并且对如何编写代码非常有见地。 不利的一面是,程序包管理并不出色,缺少泛型也有点令人讨厌。

因此,如果您想为服务器做一些事情,并且希望它能非常快地工作,那么Go是一个不错的选择。

喜欢你读的书吗? 查看我们的GitHub项目并加入社区:

加入Orbs社区:

From: https://hackernoon.com/introduction-to-go-for-javascript-developer-3e783b409e52

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值