为了账号安全,请及时绑定邮箱和手机立即绑定

TypeScript与Go:如何选择后端开发语言

标签:
Go Typescript

🤔 在 Go 和 TypeScript 之间选择作为你的后端?让我们来看看每种语言,看看哪一种更符合你的项目需求。

决定啊决定

快速一览
特性 Go TypeScript
性能 取决于框架/运行时
学习曲线 易于学习,但精通不易 对JS开发者容易,有一些细微的复杂性
并发 内置(goroutines) 取决于运行时
类型系统 静态,更简洁 静态,更灵活
生态系统 正在增长 非常庞大(npm)
应用场景 微服务及系统级编程 大型Web应用项目,全栈JavaScript开发
语言的核心特性

我们来深入探讨一下 Go 和 TypeScript 在后端开发中有哪些特点。

类型系统:Go 与 TypeScript

总的来说,Go 强调简洁和速度,而 TypeScript 则注重灵活性,并在 JavaScript 世界中增加了类型安全特性。让我们通过一些代码示例来对比这两种类型系统,让事情更加清晰。

1. 类型安全:稳一点,还是随缘?

Go 和 TypeScript 两者都是静态类型语言。但是它们采用不同的方法来保持代码的规范和有序。

  • Go: Go 更偏向于稳重行事。每个变量都需要一个明确且不会产生歧义的类型。这意味着如果你尝试传递错误的数据类型,Go 会在编译时阻止你继续进行。这可以避免你以后遇到很多麻烦,尤其是在实际应用中。
      // Go 示例
      func greet(name string) string {
          return "Hello, " + name
      }

      func main() {
          greet(123) // Boom! 这里会编译错误,因为整数不能用作字符串参数。
      }

进入全屏模式 退出全屏

  • TypeScript: TypeScript 也很严格,不过它内置了一些灵活性。TypeScript 会根据变量的使用情况推断类型,你甚至可以用 any 快速跳过类型检查(要是你敢的话!)。
// TypeScript 示例
function greet(name: string): string {
    return "Hello, " + name;
}

greet(123); // 不行!错误:不能将数字传递给期望字符串参数的函数
// 注意:类型不匹配

切换到全屏模式,退出全屏

2. 类型推断:编译器能猜到多少?

你实际需要为编译器明确多少内容呢?这些语言在推断上是这样做的,让我们看看它们是如何进行推断的。

  • Go: Go 的类型推断功能相对基础。特别是在函数和结构体中,你可以利用方便的 := 让 Go 自动推断类型,但其在推断函数和结构体的类型时不会过于复杂。
      // Go 示例
      func main() {
          age := 30 // 类型为 int
          var name = "Alice" // 类型为 string
      }

进入全屏 退出全屏

  • TypeScript: TypeScript 进一步提升了类型推断的能力。它不仅可以在函数中推断类型,还可以在许多其他情况中推断类型。这可以加快开发速度,减少手动添加类型注解的需要,但过度使用可能导致细微错误,从而长期减缓开发速度。
      // TypeScript 推断示例
      const age = 30; // 推断为 number 类型
      const name = "Alice"; // 推断为 string 类型

这是一个 TypeScript 类型推断的例子。

切换到全屏模式,或退出全屏

3. 泛型编程:代码的重用性和通用性

泛型是为了创建能够适应任何类型的灵活代码,下面我们就来看看每种语言是如何处理泛型的,这里是如何在每种语言中处理泛型。

  • Go: Go 在 1.18 版本中终于引入了泛型。虽然它的泛型设计简单明了,但相比 TypeScript 的泛型,它的灵活性稍微弱一些。但如果你喜欢简单有效,Go 可以完全满足你的需求。
      // Go 泛型示例
      func Print[T any](value T) {
          fmt.Println(value)
      }

      func main() {
          Print(123)
          Print("Hello")
      }

进入全屏;退出全屏

  • TypeScript: TypeScript 已经支持泛型有一段时间了,它们非常灵活多变。你可以添加约束条件,使类型有条件,还可以做很多酷炫的特性来确保你的代码能够灵活适应。
      // TypeScript 泛型示例代码
      function print<T>(value: T): void {
          console.log(value); // 打印传入的值
      }

      print(123);
      print("Hello");

切换到全屏模式 退出全屏

小结: TypeScript 的泛型更高级,允许你自定义和控制类型。Go 的方法则更简单直接,不需要额外的复杂性就能完成任务。

4. 结构体与接口:对类型组织的不同视角

咱们来聊聊数据结构,还有这些语言怎么帮你整理类型吧。

  • Go: Go 使用结构体来定义自定义类型,并包含字段。需要方法吗?添加到结构体中就可以了。然后,Go 的接口可以指定所需的方法列表,任何包含这些方法的结构体都会自动满足接口。
      // 下面是一个Go示例代码,包含结构体和接口
      // interface 接口
      type Animal interface {
          发声() string
      }

      type Dog struct{}

      func (d Dog) 发声() string {
          return "汪"
      }

切换到全屏模式;退出全屏

  • TypeScript: TypeScript 使用接口来定义对象、方法甚至复杂的数据结构的形状。只要对象符合特定的形状,TypeScript 就会接受它,这就是结构性类型系统的强大之处。
// 这是一个TypeScript示例,展示了如何使用接口定义动物类,以及如何实现一个具体的狗类。
interface Animal {
    speak(): string;
}

class Dog implements Animal {
    speak() {
        return "Woof";
    }
}

切换到全屏,退出全屏

要点: 两种语言都使用结构性类型,但 TypeScript 的接口更加灵活多用,不仅涵盖了数据结构,还包括了行为。

5. 联合类型和交集类型:TypeScript 的隐藏利器

TypeScript 有一些独特的功能,如联合类型和交叉类型,让你可以自由地组合和使用类型。

  • TypeScript: 联合类型允许变量可以是多种类型之一,而交集类型则将这些类型结合起来。它们在JavaScript的动态环境中非常有帮助。
      // TypeScript 示例:联合类型
      function 处理ID(id: string | number): void {
          if (typeof id === "string") {
              控制台日志("ID 是个字符串:" + id);
          } else {
              控制台日志("ID 是个数字:" + id);
          }
      }

点击全屏 退出全屏

  • Go: Go 语言不支持联合或交集类型。如果你需要类似的功能支持,你可能需要使用接口来实现类似的功能,但这并不是完全一样的。

要点: TypeScript 的联合类型和交集类型这样的特性提供了 Go 没有的那种灵活性,让 TypeScript 在处理混合类型场景时更加灵活。

每种语言中的错误处理

这里就是 Go 和 TypeScript 开始分道扬镳的地方。

Go 让你直接应对错误,

    file, err := os.Open("file.txt")
    if err != nil {
        // 处理一下错误
        return
    }
    // 用一下文件

全屏模式, 退出全屏

TypeScript 在处理异常上也跟着 JavaScript 走。

try {
    const data = fs.readFileSync('file.txt', 'utf8'); // 读取文件内容为utf8格式
    // 使用这个数据
} catch (err) {
    // 处理一下错误
}

进入全屏 退出全屏

Go 的方式可能看起来有点冗长,但它迫使你考虑可能会出哪些错误。TypeScript 的方法看起来更简洁明了,但可能会让你忽略某些错误情形。

_哈维·佩雷兹_来自Stackademic说得很好:

虽然Go中的错误处理看起来很繁琐,但实际上它也有一些隐藏的好处。

速度和规模的重要性

在讨论后端开发的速度和可扩展性时,Go 和 TypeScript 都有各自的优势。具体来看看。

速度和内存占用

Go 是两者中速度快的那一个。它是一种编译语言,这在运行速度上让它比 TypeScript 快很多。

在这一项由WWT发布的基准测试中,可以看到Go语言远远超越了TypeScript(Node.js):
Go vs TypeScript Benchmark(点击图片查看原图)

但是等等,故事还有更多的内容。现在有很多方法可以通过使用不同的运行时环境或增强 Node.js 运行时来加快 TypeScript 应用程序的运行。

例如,在这个基准测试[此基准测试](https://encore.dev/blog/event-loops)中,我们展示过一个使用开源\[Encore.ts\](https://github.com/encoredev/encore)框架的TypeScript应用可以比使用Express.js的Node.js快**9倍**(!),以每秒请求数作为衡量标准

TypeScript 性能测试

正如你所见,像Elysia这样的其他使用Bun运行时的框架,同样表现出色的性能,相比之下,甚至与标准的Node相比。

如今,对于许多网页应用,使用 TypeScript 的应用应该性能足够。

同时处理多个任务

Go 有一个很酷的招数:goroutines。这些轻量级的线程让构建能够同时完成多项任务的系统变得简单,真的很容易。

这里有个快速例子。

    func main() {
        go func() {
            fmt.Println("来自goroutine的问候!");
        }()
        // 主函数继续运行
    }

全屏 退出全屏

TypeScript(运行在 Node.js 上)做事方式与Node.js不同。它是事件驱动且非阻塞的,这在很多场景中表现得非常出色。但对于需要大量计算的任务,它可能会显得力不从心,因为它通常是单线程运行的。

这里是如何用TypeScript做类似的示例。

异步函数 fetchData() 用于从 'https://api.example.com/data' 获取数据,并将其打印到控制台。具体实现如下:
async function fetchData() {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    console.log(data);
}

这段代码定义了一个异步函数 fetchData,该函数通过 fetch 方法从指定的 API 地址获取数据,并将获取到的 JSON 数据打印到控制台。

全屏模式;退出全屏

TypeScript可以用于创建多线程应用,具体取决于使用的框架和运行时。

例如,当你使用Encore.ts时,你可以通过一个基于Rust的运行时获得多线程支持。该运行时处理请求、验证和IO,并使用napi与Node.js集成。

您也可以用其他运行时来替换 Node.js 实现多线程功能,例如Deno 和 Bun[https://bun.sh/]。

一些可用工具的介绍

Go和TypeScript在后端开发工具方面都相当强大。让我们来看看它们在开发环境和相关支持方面有何差异。

代码编辑工具

两种语言都具有强大的IDE支持,但存在一些关键的不同:

Go的热门选择:

  • Visual Studio Code:Microsoft提供的免费代码编辑器,带有Go插件,支持调试、语法高亮和代码补全。
  • GoLand:JetBrains提供的专门用于Go的IDE,内置智能功能和重构工具。每位用户每年需要支付199美元的费用。

TypeScript的最爱

  • Visual Studio Code :也非常适合 TypeScript 开发,内置支持和丰富的插件使其更加强大。
  • WebStorm :同样是 JetBrains 的一款产品,提供了高级 TypeScript 支持和智能编码特性。

带有AI增强功能的编辑器:

  • Cursor:一个基于 Visual Studio Code 的分叉版,内置了出色的人工智能功能,以实现增强编程体验。它在 TypeScript 方面表现优异,并且还支持 Go 语言。

包和库

Go保持简洁明了。Go的标准库非常丰富,所以你通常不需要依赖很多外部包。但如果没有组织良好的包管理仓库,找到最好的包可能会比较棘手。

TypeScript 可以利用 npm 的庞大生态系统资源。这提供了许多选择,但你需要谨慎选择,因为随着应用的增长,管理依赖项可能会迅速变成时间的浪费和安全风险。

管理图书馆

Go 和 TypeScript 在处理包管理方面采取了不同的方式:

Go 有一个内置的模块系统:

  • Go Modules :从 Go 1.11 开始简化了依赖关系管理。
  • GoVendor :帮助管理简单和复杂包的依赖关系。

TypeScript 使用 npm(Node 包管理器):

  • npm / pnpm:目前最大的软件包仓库,提供大量的JavaScript包。
  • yarn:一个比npm更快、更安全的包管理器。
  • Bun:Bun是一个JavaScript运行时,自带高性能的包管理器。

测试用具

两种语言都拥有扎实的测试功能。

Go的测试工具:

  • 内置的测试工具包: 提供了对 Go 包的自动化测试支持,集成的命令 go test 使用简单。覆盖了所有基础内容。
  • Testify: 一个流行的框架,提供了断言方法和模拟对象。
  • Delve: 一个流行的 Go 调试器。

TypeScript的测试工具箱

  • Jest: 非常受用户欢迎,以用户友好和功能丰富而闻名。
  • Vitest: 2022 年发布的,被认为是 Jest 的升级版,继承了 Jest 的优点,内置了 TypeScript 支持。

一些常用的框架

Go 和 TypeScript 都拥有适合不同需求的坚实框架支持,尽管 Go 传统上没有使用框架,而是依赖于标准库。

Go语言的最流行框架:

  • Encore.go:一个功能齐全的框架,用于构建类型安全的分布式系统。内置支持本地基础设施和云基础架构自动化。
  • Gin:微服务和 REST API 的最爱。又简又快。
  • Echo:以出色的文档和对 HTTP/2 的支持著称。
  • Beego:一个快速开发企业级 web 应用的 MVC 框架。

TypeScript的主要玩家:

  • Nest.js: 一个全面的框架,用于构建大规模应用。其核心遵循MVC模式,并大量使用装饰器。
  • Fastify: 不是TypeScript原生框架且不再是性能最佳的框架,但仍被广泛使用。
  • Encore.ts: Encore的TypeScript原生版本,于2024年初推出,是一个功能齐全的框架,用于构建类型安全的微服务应用。内置了运行本地基础设施的自动化工具,并与云基础设施的集成使得部署更加容易。
  • Elysia: 一个专为Bun设计的TypeScript原生框架,提供了许多功能,注重开发者体验。缺少基础设施自动化的工具。
在社区寻求帮助

Go语言的社区发展迅速。根据TIOBE 2024年的调查(TIOBE指数),现在是使用量排名第八的语言(从2023年的第11位上升到第8位)。

TypeScript 拥有一个庞大的社区。需要帮助吗?你很可能在 Stack Overflow、各种 Discord 社区或你最喜欢的 AI 聊天机器人那里找到帮助。

大规模应用

这两种语言在大公司里都经受过实战考验,证明了它们的可靠性。

"go 力量"

  • Uber 的微服务和高速后端架构
  • Google 的基础架构
  • 亚马逊的许多服务(例如)

TypeScript 运行在:

  • Microsoft的Azure云服务
  • AirBnB的主要网络应用程序
  • Netflix的用户会话管理及内容流媒体

你的选择是?这要看你的团队成员的技能、项目的具体需求和目前的技术栈。

挑选你的语言!

用 Go 还是 TypeScript 做后端?这可不简单。我们来拆解一下。

每个的最佳用法

当你需要速度和简洁时,Go 很棒:

  • 它非常适合微服务。为什么呢?因为它编译迅速,生成的二进制文件很小。
  • 你的系统需要处理很多任务吗?Go 的 goroutines 可以轻松应对这种任务。
  • 在开发云应用吗?像 Uber 这样的公司选择 Go 是因为它高效。

TypeScript 在这些方面很出色:

  • 全栈 JavaScript 项目。当你使用 JavaScript 作为前端时,使用 TypeScript 是有道理的。
  • 大型、复杂的应用程序。静态类型有助于更好地管理复杂性。
  • 需要实时更新?Netflix 使用 TypeScript 来进行实时流媒体传输和用户会话管理。

团队技巧

你团队的知识很重要:

如果他们懂 JavaScript,那么学习 TypeScript 就会很简单,Airbnb 就是这样做的。

你有一群不同类型的程序员吗?Go 简单的语法可能对每个人来说都很容易上手。

学习曲线的角度来看,Go 有 25 个关键字,而 TypeScript 有超过 60 个。然而,TypeScript 拥有更成熟的库和框架生态系统,这意味着解决常见启动问题所需的知识可能更少。

结束语

用 Go 还是 TypeScript 来做后端?这并没有一个固定的答案,这取决于你的实际情况。比如说:

Go 是你首选的语言,当你需要速度和简洁性时。它非常适合用来构建需要快速处理海量任务的系统。

这就是Go语言特别出色的地方:

  • 非常容易学习和阅读。只需要25个关键字。
  • 在很多速度测试中,跑赢了Java、Python和JavaScript。
  • 非常适用于微服务。
  • 它对类型和错误很严格,使你的代码很稳定。

TypeScript 在你需要在 JavaScript 世界中使用强类型或开发大型 Web 应用时表现出色。它的优点有:

  • 如果你懂 JavaScript,基本上也就掌握了 TypeScript。
  • 可以轻松访问大量的 npm 模块。
  • 利用合适的工具,你可以实现完整的类型安全性(甚至在运行时,比如使用 Encore)。

那么,你到底是怎么选的呢?

思考一下:

  1. 你的项目需要什么特性?需要高性能?Go 可能是你的选择。如果是 Web 开发呢?那么 TypeScript 可能更适合你。

  2. 你的团队了解哪些内容?熟悉 JavaScript 的人可能更喜欢 TypeScript。

  3. 运行速度还是开发速度?Go 运行更快,但 TypeScript 可能让你开发更快。

  4. 你能利用哪些工具和支持呢?TypeScript 有整个 JavaScript 社区的支持。Go 的社区正迅速壮大。

    从长远来看,保持你的代码整洁会有多简单?

底线: 实际上,两者各有利弊,没有哪一个明显更好。它们在不同的方面各有所长。根据你的实际需求和团队熟悉的情况来选择。

两种语言都有其优点。在决定时,请考虑你的项目需要什么,你的团队擅长什么,以及长期维护起来是否容易。

收尾

好了!希望你已经知道在你下一个项目中该使用哪种编程语言。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消