当前位置:首页 > 数码 > Go-程序员-作为一名-我为何更喜欢使用-Zig (go程序员面试笔试宝典pdf)

Go-程序员-作为一名-我为何更喜欢使用-Zig (go程序员面试笔试宝典pdf)

admin6个月前 (05-13)数码21

Zig 是一种相对较新的编程语言,于 2016 年首次推出。Zig 社区将其描述为一种用于维护稳固、可优化和可重用软件的通用编程语言。看似一句简单的描述,却隐藏着远大的抱负。

与 Go 的相似之处

作为一名 Go 程序员,我发现 Zig 及其工具链提出的主张很有意思。我在研究 Zig 时,发现这两种语言(Zig 和 Go)有一些共同之处:

  • 简单:这两种语言都采用了简单的设计理念,执行过程很顺畅,大大提高了工作效率。
  • 强类型:Zig 和 Go 都强调类型安全和可读性,这对于编写健壮和可靠的代码至关重要。

Zig 的有趣功能

除了与 Go 的相似之处外,我还发现了 Zig 的一些独特功能,使我感兴趣:

错误处理

Zig 中的错误处理效果非常好。它是 try-catch-exception 语义和 Go 错误值之间的交叉。

Zig 错误使用 error 关键字声明为一组值:

使用二进制运算符 ,可以将 Zig 错误值与正常类型的值组合起来,形成可由函数返回的 Union 类型。例如,下面的函数可以返回类型为 error 或 u32 的值,返回类型为 !u32 (或显示为 DigitError!u32 ):

Zig 用一个非常有意思的结构来处理错误。与其他语言中的异常处理类似,Zig 使用 catch 关键字将错误处理代码块附加到函数调用中,如果返回错误值,则该函数调用将被执行,如下所示: Go

Zig 还支持使用关键字 try 在调用堆栈中传播错误的机制。例如,如果 addAll 的函数返回或继续执行其他操作,下面的函数将返回错误。

最后,Zig 可以使用 if-else-switch 来更精确地过滤和处理错误结果:

Zig 测试

在 Zig 中,源代码测试是一流的组成部分,在该语言中拥有自己的 test 关键字。测试的声明方式与顶级函数类似,使用 test 关键字,后跟描述和代码块:

gotest 一样,工具链附带了 zigtest 命令,用于在源代码中执行测试:

Zig 运行

gorun 类似,Zig 提供了一个更便捷的 zigrun 命令,结合了编译和运行 Zig 源代码的步骤:

延迟

与 Go 类似,Zig 使用 defer 来简化资源管理,以便在当前执行的范围块结束时执行清理操作,例如释放资源。

Comptime

Comptime 是该语言中另一个有趣的概念,在大多数其他语言中都没有。Zig 没有单独的元语言或宏系统。但 Zig 提供了一种巧妙的解决方案,使用 comptime (或编译时)的概念将其源代码的可编程性扩展到编译阶段。

通过 comptime ,Zig 可以实现多种编译时功能:

  • 声明和使用编译时变量和值
  • 在编译时执行条件代码
  • 创建和使用编译时函数和宏

通用性

Zig 编译时可编程性带来结果是泛型类型和数据结构的实现。在 Zig 中, comptime 提供对可作为常规数据值存储和传递的类型值的访问。

由于 comptime 类型值被视为任何类型,因此 Zig 允许使用它们构建通用数据结构。例如, MakeList 使用 comptime 类型信息返回在编译时构建的结构:

Zig 可作为 C(交叉)编译器

Zig 工具链具有全功能 C 编译器,这意味着你可以使用 Zig 来替代当前的 C 编译器工具链。以下是 hello.c 源代码文件:

```c include int main() { printf("Hello, world!\n"); return 0; } ```

你可以使用 Zig 编译器将此文件编译成可执行文件:

```bash zig build-exe hello.c ```

结论

Zig 是一种激动人心的编程语言,它提供了许多独特的功能和优点。作为一名 Go 程序员,我发现 Zig 的错误处理机制、通用性、编译时编程和作为 C 编译器的能力尤其有趣。

虽然 Zig 仍然是一种相对较新的语言,但它有一个活跃而热情的社区。我鼓励所有有兴趣探索新编程语言的程序员尝试 Zig,亲身体验它的功能和潜力。


为什么要使用 Go 语言,Go 语言的优势在哪里

已经有好多程序员都把Go语言描述为是一种所见即所得(WYSIWYG)的编程语言。 这是说,代码要做的事和它在字面上表达的意思是完全一致的。 在这些新语言中,包含D,Go,Rust和Vala语言,Go曾一度出现在TIOBE的排行榜上面。 与其他新语言相比,Go的魅力明显要大很多。 Go的成熟特征会得到许多开发者的欣赏,而不仅仅是因为其夸大其词的曝光度。 下面我们来一起探讨一下谷歌开发的Go语言以及谈谈Go为什么会吸引众多开发者: 快速简单的编译 Go编译速度很快,如此快速的编译使它很容易作为脚本语言使用。 关于编译速度快主要有以下几个原因:首先,Go不使用头文件;其次如果一个模块是依赖A的,这反过来又取决于B,在A里面的需求改变只需重新编译原始模块和与A相依赖的地方;最后,对象模块里面包含了足够的依赖关系信息,所以编译器不需要重新创建文件。 你只需要简单地编译主模块,项目中需要的其他部分就会自动编译,很酷,是不是? 通过返回数值列表来处理错误信息 目前,在本地语言里面处理错误的方式主要有两种:直接返回代码或者抛异常。 这两种都不是最理想的处理方式。 其中返回代码是非常令人沮丧的,因为返回的错误代码经常与从函数中返回的数据相冲突。 Go允许函数返回多个值来解决这个问题。 这个从函数里面返回的值,可以用来检查定义的类型是否正确并且可以随时随地对函数的返回值进行检查。 如果你对错误值不关心,你可以不必检查。 在这两种情况下,常规的返回值都是可用的。 简化的成分(优先于继承) 通过使用接口,类型是有资格成为对象中一员的,就像Java指定行为一样。 例如在标准库里面的IO包,定义一个Writer来指定一个方法,一个Writer函数,其中输入参数是字节数组并且返回整数类型值或者错误类型。 任何类型实现一个带有相同签名的Writer方法是对IO的完全实现,Writer接口。 这种是解耦代码而不是优雅。 它还简化了模拟对象来进行单元测试。 例如你想在数据库对象中测试一个方法,在标准语言中,你通常需要创建一个数据库对象,并且需要进行大量的初始化和协议来模拟对象。 在Go里面,如果该方法需要实现一个接口,你可以创建任何对该接口有用的对象,所以,你创建了MockDatabase,这是很小的对象,只实现了几个需要运行和模拟的接口——没有构造函数,没有附件功能,只是一些方法。 简化的并发性 相对于其他语言,并发性在Go里面显得更加容易。 把‘go’关键字放在任意函数前面然后那个函数就会在其go-routine自动运行(一个很轻的线程)。 go-routines是通过通道进行交流并且基本上封锁了所有的队列消息。 普通工具对相互排斥是有用,但是Go通过使用通道来踢掉并发性任务和坐标更加容易。 优秀的错误消息 所有与Go相似的语言,自身作出的诊断都是无法与Go相媲美的。 例如,一个死锁程序,在Go运行时会通知你目前哪个线程导致了这种死锁。 编译的错误信息是非常详细全面和有用的。 其他 这里还有许多其他吸引人的地方,下面就一概而过的介绍一下,比如高阶函数、废品回收、哈希映射和可扩展的数组内置语言(部分语言语法,而不是作为一个库)等等。 当然,Go并不是完美无瑕。 在工具方面还有些不成熟的地方和用户社区较小等,但是随着谷歌语言的不断发展,肯定会有整治措施出来。 尽管许多语言,尤其是D、Rust和Vala旨在简化C++并且对其进行简化,但它们给人的感觉仍是“C++看上去要更好”。 【Go语言的优势】可直接编译成机器码,不依赖其他库,glibc的版本有一定要求,部署就是扔一个文件上去就完成了。 静态类型语言,但是有动态语言的感觉,静态类型的语言就是可以在编译的时候检查出来隐藏的大多数问题,动态语言的感觉就是有很多的包可以使用,写起来的效率很高。 语言层面支持并发,这个就是Go最大的特色,天生的支持并发,我曾经说过一句话,天生的基因和整容是有区别的,大家一样美丽,但是你喜欢整容的还是天生基因的美丽呢?Go就是基因里面支持的并发,可以充分的利用多核,很容易的使用并发。 内置runtime,支持废品回收,这属于动态语言的特性之一吧,虽然目前来说GC不算完美,但是足以应付我们所能遇到的大多数情况,特别是Go1.1之后的GC。 简单易学,Go语言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go关键字是25个,但是表达能力很强大,几乎支持大多数你在其他语言见过的特性:继承、重载、对象等。 丰富的标准库,Go目前已经内置了大量的库,特别是网络库非常强大,我最爱的也是这部分。 内置强大的工具,Go语言里面内置了很多工具链,最好的应该是gofmt工具,自动化格式化代码,能够让团队review变得如此的简单,代码格式一模一样,想不一样都很困难。 跨平台编译,如果你写的Go代码不包含cgo,那么就可以做到window系统编译linux的应用,如何做到的呢?Go引用了plan9的代码,这就是不依赖系统的信息。 内嵌C支持,前面说了作者是C的作者,所以Go里面也可以直接包含c代码,利用现有的丰富的C库。

作为一名程序员,是什么让你每次听到这句话时都翻白眼呢?

基本上,“灵丹妙药”会莫名其妙地引起过于急切的中层和上层管理人员的注意,有时想法很好,但执行得很糟糕,有些就是愚蠢。在企业界,它们每两年就会出现一次(通常会大吹大擂)。处理这些愚蠢问题的不仅是软件,我们也可能成为主要目标。参见管理时尚-维基百科的部分列表。

有一种全新的企业流程将扭转一切。

第一个我遇到的是一个叫做“全面质量管理”的东西,最近与一个巨大的“敏捷”列表,世界新魔术子弹承诺只是生成培训课程和无聊的会议,并悄悄地消失在一个合适的时间,通常当宣布一些新的更好的灵丹妙药。这些通常会影响整个组织。(face-slap)

有一种新的编程范式将改变一切。

这些是特定于软件的,还有更严重的,因为它影响了我们的工作方式和工作方式。我想到的两个词是“OO”和“UML”,这两个词现在都被认为是完全被夸大了,而且可能有一些用处,它们倾向于迫使一些开发走上低效和潜在危险的道路。《再见,面向对象编程》是一本值得一读的书。

曾经有一段时间,当你批评OO或UML时,你会被视为某种疯狂的无政府主义者。在我的例子中,我并没有偏离目标太远,但是慢慢地我意识到这些在某些情况下是非常有用的,在某些情况下使用它们是非常愚蠢的。这完全取决于你在做什么,我们需要灵活地为手头的任务选择合适的工具,

是的,当需要OO时,我使用了一点OO,并试图保持它的简单性。然而,我通常更喜欢函数式编程,我不得不清理过度热情的OO开发人员的代码,他们在不需要继承的地方使用继承(在一个案例中有12个继承级别),并看到了编写糟糕的OO的黑暗的一面。

UML(我称之为无用的建模语言)我用它来扩展设计文档,这样那些仍然想要使用它的人会感觉良好,但我从来没有发现它在帮助我设计产品/项目中有任何用处。这通常是在纸上的午餐或在白板上的设计会议上完成的。我认为设计应该是非正式的,当然UML有一些有用的符号,但是关于从UML到生成代码的整个bollix将从我那里得到一个(耳光)

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Go

“Go-程序员-作为一名-我为何更喜欢使用-Zig (go程序员面试笔试宝典pdf)” 的相关文章

Templ-编写-Go-用户界面-HTML-如何在-中经常使用 (temple)

Templ-编写-Go-用户界面-HTML-如何在-中经常使用 (temple)

简介 templ[1]是一个在Go中编写用户界面的言语。经常使用templ,咱们可以创立可出现HTML片段的组件,并将它们组合起来创立屏幕、页面、文档或运行程序。 装置 咱们可以...

在-使用-应用-中构建高性能-Echo-Web-Go (在使用应急法压缩时间时,不一定)

在-使用-应用-中构建高性能-Echo-Web-Go (在使用应急法压缩时间时,不一定)

Echo是一个高性能且易用的框架,用于构建Go语言编写的Web应用。它具备灵活的路由功能、方便的请求处理、强大的中间件支持和简单的JSON操作,非常适合快速开发API服务和Web应用。 快速...

Go-内存调配优化-在结构体中充沛应用内存 (go 内存)

Go-内存调配优化-在结构体中充沛应用内存 (go 内存)

在经常使用Golang启动内存调配时,咱们须要遵照一系列规定。在深化了解这些规定之前,咱们须要先了解变量的对齐形式。 Golang的unsafe包中有一个函数Alignof,签名如下: f...

内存效率-多用途-语言中使用切片代替数组的优点-动态大小-Go (内存使用效率)

内存效率-多用途-语言中使用切片代替数组的优点-动态大小-Go (内存使用效率)

引言 在 Go 语言中,数组是一种固定长度的数据结构,而切片则是一种可变长度的数据结构。虽然数组和切片都可以存储相同类型的数据元素,但切片在使用上有其独到的优势,本文将通过介绍切片的特性来解释为...

并非你构想得那么便捷-Go中的switch的六种用法 (并非你构想得到的成语)

并非你构想得那么便捷-Go中的switch的六种用法 (并非你构想得到的成语)

Go以其繁复而著称,但并不是每团体都相熟这种言语中switch语句的多样性。首先,假设你对Go的switch语句还不相熟,它或许与其余言语相比有些不同。 上方是一个便捷的示例来展现它是什么...

b-Go-成功线程安保的缓存-sync.Map-中经常使用-b

b-Go-成功线程安保的缓存-sync.Map-中经常使用-b

缓存是提升现代运行程序性能的关键方面。它准许您存储并极速检索低廉操作的结果或经常访问的数据,缩小了重复从新计算或失掉数据的须要。在本文中,咱们将讨论如何经常使用sync.Map包在Go中成功线程安...

Go-如何在-中经常使用环境变量 (go如何在linux编译)

Go-如何在-中经常使用环境变量 (go如何在linux编译)

作为软件开发人员,咱们深知在名目中治感性能变量的关键性。在本篇文章中,我将引见在Golang中解决环境变量的弱小工具 .com/joho/godotenv 包。应用这个包,你可以简化...

在Go中高效治理同步和异步处置

在Go中高效治理同步和异步处置

在开发环节中,当须要同时处置多个操作时,开发者经常面临同步和异步两种处置形式的选用。 同步处置 在同步处置形式中,义务按顺序一个接一个地口头。每个义务必定在下一个义务开局之前成功。这象...