G#初探:一门面向.NET的Go风格语言

作者: CBISMB

责任编辑: 邹大斌

来源: CBISMB

时间: 2026-08-26 09:19

关键字: 微软 AI安全 企业IT Apple 渠道生态

浏览: 1427

点赞: 69

收藏: 10

微软开源.NET不仅加快了平台自身的开发速度,也让新语言和新功能得以在.NET运行时和编译器之上构建。与此同时,Visual Studio Code的可扩展性让开发者能够轻松提供使用这些新平台能力所需的工具。

在.NET之上构建的较有趣的新项目之一,是一门名为G#的Go风格语言。它同时面向系统编程和移动应用,目标是交付可用于其他.NET应用的小型、安全的应用和库。G#是一种吸收Go、Kotlin和Swift经验教训的方式,产出可与.NET程序集和库协作的代码,并利用NuGet等类似的仓库服务,在成熟的.NET平台之上进行构建。该项目在GitHub上开发,发布周期快得惊人。

入门G#

G#的入门很简单。你需要受支持的.NET版本,以及目标操作系统的相应SDK。G#产出的代码兼容.NET 8到.NET 10,不过推荐使用.NET 10。G# SDK和模板可从NuGet获取,这确保你可以通过.NET CLI安装并运行G#。

最快的上手方式是安装G#模板,然后用它创建一个控制台应用,再用你喜欢的开发工具打开并开始扩展。基本应用的结构非常简单:一个项目文件、程序.gs源文件,以及一个用于管理包和库的NuGet配置,还支持本地SDK(如果你从源码构建G#,这会很有用)。构建并运行默认控制台模板速度很快,在一台Arm架构的Windows PC上4秒多一点点即可输出结果,这对构建和调试更大规模的应用是个好兆头。

安装的模板在基本控制台实现之外,还为多种不同类别的应用和库提供了选项。此外,还有一个G#的Visual Studio Code扩展,可从Visual Studio市场下载,其中包含相应的语言服务器组件,应能加快开发速度。文档中提供了安装该扩展的命令行选项,免去了搜索必要文件的麻烦,让你下次打开VS Code就能开始用G#编码。

或者,你也可以直接使用G#自己的gsc编译器,而不是让.NET CLI通过MSBuild来调用它。当你想输出面向特定.NET版本的代码,或编译为程序集供其他.NET语言使用时,这种方法很有用。这种方式避免了使用解释型代码,可以直接交付预编译的二进制文件。

G#语言内部结构

G#语言本身很直观。代码按包组织,可执行部分定义为func。默认情况下,G#使用.NET的System命名空间,因此你可以使用熟悉的构造,无需为了做常规的事情另学一套方法。如果不想默认引入System,可以在编译器配置中禁用导入。

每个函数都可以接受参数并返回值,类型在参数列表中声明。参数列表可以以返回值的类型声明结尾,从而确保你返回的是预期的数据。大多数类型都包含长度信息,例如int64,同时也为其他语言中惯用的类型提供了别名。字符串允许添加对齐和格式化信息。除函数外,你还可以定义结构体和类来帮助处理变量,结构体处理值,类处理引用。类似地,数据结构和类让你可以把变量当作数据来对待,进行复制和赋值。

大部分语言结构都会让人感到熟悉,尤其是如果你习惯使用Go这类语言。其中有一些有趣的快捷方式,例如用if let在解析函数参数时检查空值。你可以把if let与G#的异常处理结合使用,管理更复杂的程序流程。其他特性还包括用for in遍历集合,让你交付和使用任意长度的数组,而无需在运行操作前确定长度。

在分布式系统中使用G#

G#被设计为支持异步编程,这对分布式应用至关重要。它使用熟悉的async和await构造,不过在这里是async func。有趣的是,你可以选择把一组异步操作包裹在一个作用域中,从而运行一系列操作并管理失败情况,同时保留成功操作的结果,供应用的其他部分使用。这让你可以把父操作和子操作绑定在一起,确保父操作总是在子操作之后返回。你可以用异步序列处理流,如果愿意,在使用Go扩展包的情况下还支持Go风格的channel。

最后这个选项提供了另一种异步操作方式,包括"发射后不管"(fire-and-forget)的go调用,让你并发触发外部函数而无需等待响应。你的主函数会继续运行,不需要知道成功或失败。这里有一个有趣的选项:把.NET风格的异步编程与Go的fire-and-forget并发及其内置的发布-订阅channel混合搭配使用。

融合.NET与Go

越深入钻研G#的语言结构,越能看出它是.NET思路(源自Pascal及类似语言家族)与Go(带有结构化的C语言血统)的混合体。这使G#成为一个非常灵活的工具,而且非常适合与基于.NET的Kubernetes应用配合使用。

另一个关键特性是能够与.NET生态系统的其余部分互操作,导入命名空间并在函数中使用方法。导入的包可以被赋予别名以简化调用,G#在自身构造之外还支持.NET类型和集合。它甚至支持事件和委托,以及通过DLL和库导入与非托管代码协作。

很实用的是,项目文档包含了G#与Go和C#的对比表,通过与熟悉特性的直接对比,帮助你过渡到不同的工作方式。如果你目前正在.NET环境中工作,在编写第一批G#应用时,不妨把C#对比表打开放在手边。

G#适合做什么

G#的一个有趣用途是作为教学语言。它小巧且行为可预测,适合课堂教学,简化了授课和批改作业。之后你可以把G#当作进入更广泛.NET生态的入口,或者从Swift或Kotlin的移动开发转向C#和其他.NET语言,在逐步培养企业级开发技能的过程中两者并用。

由于语言表面积比其他.NET语言更小,G#成为WebAssembly和Hyperlight微型虚拟机领域一个有趣的候选者。通过编写在比C#更受限的环境中运行、但仍编译为在WebAssembly上运行的.NET代码,G#有望为Kubernetes和其他分布式编程环境交付快速加载的模块——在这些环境中,快速加载的无服务器组件提供了应用和用户都需要的响应速度。

目前来看,不要指望G#支持C#或VB.NET使用的所有语言构造。对于一门定位更小巧的语言来说,它仍处于非常早期的阶段,并非所有计划中的特性都已就绪。但这不应阻止你尝试它,尤其如果你有iOS或Android开发背景,想把代码带到Windows和Azure上。G#与这类编程语言的相似性,应该能让你更容易拥抱新平台并移植现有代码。

©本站发布的所有内容,包括但不限于文字、图片、音频、视频、图表、标志、标识、广告、商标、商号、域名、软件、程序等,除特别标明外,均来源于网络或用户投稿,版权归原作者或原出处所有。我们致力于保护原作者版权,若涉及版权问题,请及时联系我们进行处理。