前面说到 defer 还有其他的任务, 也就是 defer 中执行的 recover 可以捕获 panic 抛出的异常.
还有 defer 可以在 return 之后修改命名的返回值.
上面2个工作要求 defer 只能在函数退出时来执行.
楼主说的 defer 是类似 Swift2.0 中 defer 的行为, 但是 Swift2.0 中 defer 是没有前面2个特性的.
Go中的defer是以函数作用域作为触发的条件的, 是会导致楼主说的在 for 中执行的错误用法(哪个语言没有坑呢?).
不过 for 中 局部 defer 也是有办法的 (Go中的defer是以函数作用域):
for {
func(){
f, err := os.Open(...)
defer f.Close()
}()
}
在 for 中做一个闭包函数就可以了. 自己不会用不要怪别人没告诉你.
1.10 许多语言内置设施不支持用户定义的类型
for in、make、range、channel、map等都仅支持语言内置类型,不支持用户定义的类型(?) 。用户定义的类型没法支持for in循环,用户不能编写像make、range那样“参数类型和个数”甚至“返回值类型和个数”都可变的函数,不能编写像channel、map那样类似泛型的数据类型 。语言内置的那些东西,处处充斥着斧凿的痕迹 。这体现了语言设计的局限性、封闭性、不完善,可扩展性差,像是新手作品——且不论其设计者和实现者如何权威 。延伸阅读:Go语言是30年前的陈旧设计思想,用户定义的东西几乎都是二等公民(Tikhon Jelvis) 。
说到底, 这个是因为对泛型支持的不完备导致的.
Go语言是没啥NB的特性, 但是Go的特性和工具组合在一起就是好用.
这就是Go语言NB的地方.
1.11 没有泛型支持,常见数据类型接口丑陋
没有泛型的话,List、Set、Tree这些常见的基础性数据类型的接口就只能很丑陋:放进去的对象是一个具体的类型,取出来之后成了无类型的interface{}(可以视为所有类型的基础类型),还得强制类型转换之后才能继续使用 , 令人无语 。Go语言缺少min、max这类函数,求数值绝对值的函数abs只接收/返回双精度小数类型,排序接口只能借助sort.Interface无奈的回避了被比较对象的类型,等等等等,都是没有泛型导致的结果 。没有泛型 , 接口很难优雅起来 。Go开发者没有明确拒绝泛型 , 只是说还没有找到很好的方法实现泛型(能不能学学已经开源的语言呀) 。现实是,Go 1.0已经定型,泛型还没有,那些丑陋的接口为了保持向后兼容必须长期存在着 。
Go有自己的哲学, 如果能有和目前哲学不冲突的泛型实现, 他们是不会反对的.
如果只是简单学学(或者叫抄袭)已经开源的语言的语法, 那是C++的设计风格(或者说C++从来都是这样设计的, 有什么特性就抄什么), 导致了各种脑裂的编程风格.
编译时泛型和运行时泛型可能是无法完全兼容的, 看这个例子:
type AdderT interface {
Add(a, b T) T
}
我们真的需要Go语言吗?我们这个世界真的需要另外一种C语言风格的编程语言吗?很显然,谷歌很早就这么认为了,在 2009 年,它借用雷蒙斯乐队的歌“Hey!Ho!Let’s Go”,正式推出了 Go 语言 。现在 Go 语言开发团队已经开发出了这种语言的第一个稳定版本,他们称之为 Go 1,他们将这种语言推向世界,希望人们用这种语言“开发出健壮的软件产品和作品 。”那么 , 现在人们对这种语言的使用情况又是如何呢?让我们先回顾一下,什么是 Go 语言,是什么促使谷歌决定推出这样一种语言?按 Go 语言的“常见问题”里的说法 , 自从那个“重要的系统级编程语言”诞生距今已超过十几年了,这段时间计算机世界已经发生了很大的变化 。谷歌的才人们对目前现有的各种语言深感失望,他们必须要在“快速的编译、快速的执行或简单编程”之间做出选择 。“没有一种主流的编程语言,例如C,C++,Java,Python 等,能提供谷歌人想要的全部特征 。于是,谷歌的工程师从 2007 年起开始开发 Go 语言 。“常见问题”里这样说:Go 语言在基本语法上”基本上属于C语言家族“,但它从 Pascal 语系吸收了”大量的理念“ , 还有一些思想是来自其它的语言 。但对于程序员来说,应该把它当成一种全新的语言,一种以”让程序员更有效率,让编程更有效率,至少是让我们更有效率并且使编程更有乐趣“的理念为设计目标的编程语言 。Go 语言擅长做什么…?那么,Go 语言擅长做什么?根据谷歌著名的软件工程师——Go 语言的设计人之一——Rob Pike 的说法,它是用来开发”大型软件“的 。Pike 说 Go 语言适合于”很多程序员一起开发的大型软件,并且开发周期较长,支持云计算的网络服务:简言之,就是服务端软件 。Go 语言能够让程序员快速开发,并且在软件不断的增长过程中,它能让程序员更容易地进行维护和修改 。它融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性 。“(作为原贝尔实验室 Unix 开发小组成员,Pike 对系统软件有相当的认识 。)但对于其它类型的软件 , Go 语言也一样的好用 。例如,我在 Google+ 上询问了 Go 语言的使用者,得到了 Douglas Fils 的回复,他正在拿各种语言做实验 。Fils 说他现在有时会开发一些 Web 应用程序,大多数都是在 Java 虚拟机(JVM)平台上 。“所以 Java 自然是最常用的 。我最近开始尝试更多的语言,例如 Scala 和 Groovy 。我用 Groovy 语言已经开发了不少的东西,而且刚刚完成了一个 Groovy/Grails 语言上的大型项目 。我还研究了一下 Ruby on Rails/Python (Python 框架) , 并用它们做了一些东西 。”他说他用早期版本的 Go 语言开发了一个 Web 界面来处理数据资源 。但很不幸 。“当时的 Go 的程序库和语法使得开发起来很困难 。我还尝试了 node.js,而且,到了一月份,我的精力完全转向了 node.js.”Node.js , Fils 说,很流行,“虽然我很喜欢它 , 但它的单线程事件循环机制和非阻塞的编程模式让我不太满意 。还有,所有的东西都要用 Javascript 的回调函数,我不喜欢这样 。”很显然,他不是一个 JavaScript 的粉丝 。Go 语言的语法和结构,从另一方面讲 , “还是很简洁的 。”当Go 语言的语法和结构趋于稳定 , 并发布了 Go 1 时,他觉得应该转回来,重写他的 Go 语言程序 。这回,他想起来了当初为什么想用 Go 来开发 。关于Go 语言的争论Fils 说,在 Java 里,很多东西都需要有一定的模板套路,这是很讨厌 。他说 Scala 和 groovy 要好一些,但仍然是个问题 。Go 语言给人的感觉像一个动态的类型化语言,Fils 说,但 Go 语言里静态类型特征并不像 Java 里那样明显 。Go 语言的垃圾收集管理 , 比 JVM 要好的多 。跟 Groovy 这样的动态语言比起来尤其能看出这点 。Fils 在评论中说 Go 语言的速度比其它语言快很多倍 。它运行速度快但不影响负载量 。它编译所需的时间很短,他在开发时能边开发边编译 , 就像动态语言那样迅速 。最后,他说使用 Go 语言要比使用 Node.js,Java 或以 Java 为基础的语言 , Ruby on Rails 等语言要有趣的多 。在开发 JVM 平台上的应用时,我总感觉自己是一个系统管理员,而不是一个开发者 。我要修改堆空间,我要研究负载均衡或内存问题或其它的资源管理问题 。而使用 Go 语言,我不需要考虑这些 。我开发,编译,测试,运行,部署,非常的享受 。请注意 , 并不是所有的人都喜欢 Go 语言 。你可以看一看 Shaneal Manek 的关于 Go 语言的垃圾收集系统以及脚本语言和编译型语言之间比较的评论 。Go 语言能走向主流吗?你的期望是什么?按照 RedMonk’s Stephen O’Grady 的说法,对于 Go 语言来说现在还非常年轻 。通常,程序员会分成两个阵营:要么欢迎底层语言和脚本型/垃圾收集器型语言的融合,要么是反对这样做 。对于后者,毫无意外的,他们是C语言的坚定拥护者 。围绕着 Go 语言有很多的争论 , 这不令人吃惊,任何一种语言都是这样 。而令人吃惊的是目前 Go 语言在程序员中获得了相当的吸引力 。O’Grady 二月份在 RedMonk 编程语言分级中把 Go 语言放入了第二梯队 。但是 , 他说,考虑一下 Go 语言是如此的年轻 , “即使是目前这种成绩也是让人相当的印象深刻了 。”谷歌已经发布了 Go 语言的稳定版本,并且在 Google App Engine 支持部署这种语言的应用,这将给 Go 语言带来更多的吸引力 。Go 语言能否成为一种“主流”语言 , 这需要由时间来判定 。不过,看起来除谷歌之外还有很多公司对这种语言也很感兴趣,比如 Engine Yard 等公司 。那些对目前的现存的语言不太满意的程序员大概对 Go 语言都在拭目以待 。如果你在使用 Go 语言或之前简单涉略过它,你需要注意,Go 1 版引入了不少的变化 。然而从 Go 1 版开始 , Go 语言的变化将会遵循它的规格说明书进行 。根据 Go 语言的开发人员的透露 , “也许在某个时间 , 我们会推出 Go 2 的规范,但在此之前,用 Go 语言编写的程序在今后的 Go 1 版本(Go 1.1, Go 1.2 等)上都能正确的运行 。”你用Go 语言开发过什么项目吗?
- mysql怎么把两个字段拼在一起 mysql字段拼接中文
- 学了mysql还要学sql吗 mysql学好了有啥用
- 将数据保存到文件中c语言 将数据保存到mongodb
- redis多线程还是单线程 怎么理解redis多线程
- 罗布人村天气 mysql语言具有的功能
- redis多线程还是单进程 redis多进程并发问题
- redis编程语言 redis对应c语言
- redis一般和什么语言一起开发 和redis类似的编程
- redis多线程还是单线程 redis内部多线程
- mongodb采用什么语言 mongodb的设计采用什么
