go语言为什么不看好 go语言排名为什么不高( 六 )


前面说到 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语言如此不受待见其实并没有不受待见,用的人还是很多的 , 解决一些特定领域的问题也很方便 。
每种语言的流行程度主要取决于这个语言最著名的killer app的流行程度,C有Linux,Go有Docker
Go语言为什么火不起来?目前大部分产品都用c或者c++或者其它主流语言编写的,go产品还是很少
go语言工程师少
有编程基础的人学go语言很简单,但是对于新手来说太难,现在大多go语言教材都是给会编程语言的人学习,比如教材中说变量、对象、函数 。新手能理解这些? 一个变量都的去查很多资料来了解什么是变量, 所以新手入门难,而老程序员又都习惯用自己拿手的语言,导致go开发师少 。
为什么我不喜欢Go语言式的接口所谓Go语言式的接口go语言为什么不看好 , 就是不用显示声明类型T实现go语言为什么不看好了接口I,只要类型T的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方 。这种做法的学名叫做Structural Typing , 有人也把它看作是一种静态的Duck Typing 。除go语言为什么不看好了Go的接口以外,类似的东西也有比如Scala里的Traits等等 。有人觉得这个特性很好 , 但我个人并不喜欢这种做法 , 所以在这里谈谈它的缺点 。当然这跟动态语言静态语言的讨论类似,不能简单粗暴的下一个“好”或“不好”的结论 。

推荐阅读