我是如何完成从 Scala 到 Go 过渡的?

发布于 2021-11-04 13:41 ,所属分类:软件编程学习资料

一年前,我以软件工程师的身份加入 Google。我的团队使用 Go 编写了一些让 Google Cloud 保持运行的代码。一年后,我使用这门语言变得非常高效,我获得了 Go 的可读性,而且我丝毫没有想念使用 Scala 编写软件。

Scala 有一些特性使它成为一种有吸引力的语言,至少对我来说是这样。这些特性之一是可以使用高阶函数。

高阶函数是简单的函数,可以接收函数作为参数并返回另一个函数作为结果。让我们看一些例子。

defaddS(n:Int)=n.toString()+"S"
valxs=List(1,2,3,4,5)
valsomeNumsWithS=xs.map(addS)

请注意,map 接收一个函数作为参数,在我们的例子中,接收到的函数是 addS。

另一个例子是一个函数返回另一个函数,而不是一个具体的值。

defaFunc=addS
valfn=aFunc
fn(5)
-->5S

在这里,aFunc 是另一个函数的函数 addS 的返回值。

Scala 中的这两个函数结构非常重要,但是 Go 以类似的方式呈现它们,让我们看看如何实现。

funcAddS(nint)string{
returnstring(n)+"S"
}
funcmap(xs[]int,fnfunc(int)string)[]string{
result:=[]string{}
for_,n:=rangexs{
result=append(result,fn(n))
}

returnresult
}
xs:=[]int{1,2,3,4,5}
someNumsWithS:=map(xs,AddS)

在这个例子中,我们实现了与 Scala 中相同的实现。我们有一个函数 map 接收另一个函数 fn 作为参数。只要它具有相同的签名,我们可以将任何函数传递给 map。

就像在 Scala 中一样,我们可以创建返回其他函数的函数。

funcaddOne(nint)func(int)int{
returnfunc(){returnn+1}
}
fn:=AddOne(5)
x:=fn()
-->6
funcsum()func(int,int)int{
returnfunc(a,bint)int{returna+b}
}
varsfunc(int,int)int=sum()//与s相同:=sum()
s(3,4)
-->7

请注意如何对 s 进行类型注释以显示类型,但这完全没有必要,因为它可以写为 s := sum().

前面的例子让我想到了另一点,它使从 Scala 到 Go 的转换变得非常容易,那就是类型推断。

Go 有很好的类型推断。它与 Scala 最不同的是,在 Go 中,我们需要指定函数的返回类型,就像我们在预览示例中看到的那样。AddS 返回 string,sum()返回 func(int, int)int 等等。在 Scala 中,大多数时候,我们可以跳过函数的返回类型,它仍然会从上下文中正确推断出来,并且编译器将始终检查类型正确性。然而,即使类型推断系统允许我们省略一些字符,我也会总是用 Scala 编写它们,因为它有助于更好地理解函数的作用。

Go 是一种简单的语言,与 Scala 相比,它更容易学习。例如,在 Scala 中有很多很多方法可以迭代一个集合:

valvalues=...
values.forEach
values.map
values.filter
values.first
values.foldLeft
values.collect
values.takeWhile
...

在 Go 中,有一种方法,更简单、更明确的方法:

values:=...
foridx,value:=rangevalues{
//dowhatyouneedtodo
}

集合中的所有内容都使用最基本的工具 for 循环解决。在 Scala 中,有许多花哨的实用程序,它们都以非常有效的方式解决特定问题。然而,这意味着我们必须知道所有这些不同的实现、它们的类型签名、它们的用例等等……

在 Go 中,我们有 for 一个始终有效的简单、优雅的解决方案。

从 Scala 过渡到 Go 还有一件事,那就是并发程序的编写方式。请参阅 Go 中的基本并行计算 以及更多关于 Go 通道、并行性和并发性的内容

总的来说,我认为 Scala 是一种非常强大的编程语言,拥有丰富的工具,并且在函数式编程领域中占有一席之地。然而,它带来了额外的复杂性,固执己见,并且拥有非常分裂的用户群。它的库通常实现得很好,但很难使用,尤其是对于那些缺乏函数式编程经验的人。另一方面,Go 是一种简单、快速、干净、小巧的语言,非常容易学习。借助 Go,我们构建了世界上最大(可能是最大的)基础设施系统之一,为 Google Cloud 提供支持。Go 允许数千名工程师一起工作,这似乎证明了 Go 的简单且不失强大。

原文链接:https://itnext.io/the-transition-from-scala-to-go-27603e373986

推荐

NAT 穿透是如何工作的:技术原理及企业级实践

Kubernetes入门培训(内含PPT)



随手或者”在看“,诚挚感谢!

相关资源