看了一个 go 语言,感觉语法略为不习惯。

2016-01-27 09:42:17 +08:00
 fire5
还是大 python 舒服。。
21554 次点击
所在节点    Python
151 条回复
johnsneakers
2016-01-27 18:32:49 +08:00
@zongwan 不麻烦, sublime 装个插件 自动引用。 我已经好久没自己写引用了。
cutepig49
2016-01-27 18:44:43 +08:00
我就很喜欢 go 这种设计,浑身上下都透着憨直的傻气,不讲花招,没得商量,谁来都一样。
3 个月 Go 经验的人写出来的代码中规中矩, 3 年 Go 经验的人也不会有什么奇技淫巧可以用。
mengzhuo
2016-01-27 19:12:14 +08:00
脑残粉、黑,其实应该不算深入软件开发的人,成熟的工程师肯定会选合适的工具做合适的事情。
就像生活中,大家不会拿美工刀切肉,拿菜刀切纸一样。
而且语言只是思路的表达方式,重要的还是数据结构和算法╮(╯▽╰)╭

@bramblex

你曲解系统编程了。
系统编程是:针对专门的系统、场景进行的编程,不是制作操作系统编程。
对 Golang 来说,他针对的场景就是服务器、分布式系统。
你们可以看看人家文档的第一段:
Go is expressive, concise, clean, and efficient. Its concurrency mechanisms make it easy to write programs that get the most out of multicore and *networked machines*, while its novel type system enables flexible and modular program construction. Go compiles quickly to machine code yet has the convenience of garbage collection and the power of run-time reflection. It's a fast, statically typed, compiled language that feels like a dynamically typed, interpreted language.

@noli
严谨是指,你要对所有可能出错的地方进行一番思考和处理,而不是一个 try catch/expect “偷懒”地掩盖了所有的错误。
mengzhuo
2016-01-27 19:27:31 +08:00
p.s. 要说为什么我喜欢 Golang :
1. Channel 可以很爽地刷多核。( Client.Write 不用上锁啊!!消息还是跨核传递的!!)
2. 单文件解决所有问题、可以轻松部署(身为 Python 开发的我已经深深地迷上这点了)
3. 工具链完备、各种分析很容易做,内存大部分不用管。(哪里慢点哪里!)
4. 性能还不差,有赶超 C++的趋势( SSE 已经有了, AES Go1.6 支持了, AVX 、 FMA 也都会有的、嗯)
5. 原生支持生产代码、风格统一、标准得很漂亮(租里都别吵了, go fmt/vet 一下就好)
-----------
以上几乎都是服务端开发中的痛点,如果这个语言服务端开发不看看的话,我觉得真的很遗憾。
geew
2016-01-27 19:33:02 +08:00
最近也在写 也是各种槽点啊 那个混蛋说 go 适合 python 开发转的....我保证不打死他
ethego
2016-01-27 19:34:31 +08:00
@geew 写 python 的可以去看看 lua ,各种舒服,这是我最欣赏的语言
Comdex
2016-01-27 19:42:07 +08:00
go 的 error 机制真的挺适合服务端的,要求你什么错误都得考虑,不像别的语言那样抛个异常就算了?
penjianfeng
2016-01-27 21:57:36 +08:00
之前写 PHP,刚开始玩 go 的时候,啥?nil 是什么?类型居然在变量的后面定义?if/switch 居然不用括号?我用 PHP 几行代码就搞定的事儿用 go 写了一大堆,WTF!!!!然而....写了半个月,突然觉得好爽...严谨不失简洁,build 了时候就已经杜绝了很多 bug,test 写起来也很爽.我现在已经很少写 PHP 了...
0987363
2016-01-27 22:13:03 +08:00
不觉得,倒是觉得 python 语法反人类
noli
2016-01-27 22:32:54 +08:00
@mengzhuo 这么说?你认为 golang 不用 try catch 用 err 是比较严谨的行为?

我能理解有些人的想法,认为 try catch 会制造机会让程序员写出什么 error 都不管也不抛的代码出来;而返回一个 err 加上编译器强制检查是否使用过 err 可以解决这类问题……

恕我直言,这样思考问题还是不够抽象,太幼稚……

首先,不合格的程序员无论怎么低等级,战胜编译器还是易如反掌的……

譬如,一个函数 do_transaction 里面要串行执行多个(但数量并不是固定的,譬如在循环里面调用)有可能返回 err 的方法,现在,编写一个方法调用 do_transaction ,如果有错误,对已经执行过修改进行回滚,但是,其中某些 err 是可以忽略的,请问这个方法要如何才能知道在哪一步产生了错误?

你瞧不起 try catch , 认为这是偷懒?偷懒的是人,通过把语言功能弱化来迁就人,我也是醉了……

如果你说这不是 golang 解决的问题——基本的事务都解决不了,那么请问他何以自称服务端开发语言?

再来说说你所谓的有点:
1. channel 刷多核,消息跨核传送——我觉得,只有那些只用过 python nodejs 的人才会把这个当卖点吧? C# async + task + 自带的线程池,一样轻松愉快刷多核

2. 单文件解决所有问题?—— 没有动态库当成优点,应该是 golang 脑残粉才做得出来吧? hotfix 怎么办? 增量式部署更加是奢望了

3. 工具链完备,各种分析很容易做? 呵呵,以 golang 那么点历史,大概还没有项目经历过重构吧?以它那么低的语言表达能力,重构一定很爽。有 interface {} 这种东西,静态分析基本上都可以废掉了。

4. 性能还不差 —— http://kokizzu.blogspot.com/2015/02/framework-benchmark-10-preview.html 这个 benchmark 好像不太同意你的说法哦

5. 原生支持生产代码、风格统一、标准得很漂亮 —— 建议你了解一下 clang-format , golang 这种自己帮你加分号的丑陋东西就不要拿出来 BB 了……
noli
2016-01-27 22:52:49 +08:00
补充我刚刚说的那个 do_transaction 的问题。

exception 的概念优秀之处在于,抛出异常保留现场(包括整个调用栈),这其实是一个非常有用的工具。如果没有 exception ,那么就要程序员自己写代码,想办法来保留可能有用的数据。

golang 这种直接把错误当作一个返回值传出去,在我看来才是完全不负责任的表现——就是想把错误应付过去就算了……都返回结果了,哪里还有什么现场可言?

尤其是在返回不定多个 err 这样的场景下(例如 do_transaction 的例子), golang 是静态编译的没有办法直接在语言层面返回不定多个 err ;那么就只能: 1. 把 err 都放到一个值返回出去做检查,请问这样跟 catch 掩盖错误有什么区别吗?然后,如果你不想程序轻易当掉的话,你还要手工去分析 err 的各种可能性,否则漏了一个的话,你就会惊喜的看到上线后不定期 crash …… 而支持 exception 概念的基本上语言层面直接把 error 分发到对应的分支了,实在不想让程序 crash ,你总是有办法的。 2. 就是在写的时候手工做一些 book keeping 来纪录执行到哪里出问题…… 那为什么不直接用语言提供的措施?这跟 exception 有什么区别吗?

可能有些人觉得 exception 都是 IO 才会产生,现场不重要。那么,用 golang 就意味着只能外面拼接一个 DSL 或者其他语言才能做事务了——这么说来,它其实也就是一个用来拼凑业务逻辑的东西,根本不是什么系统编程语言。

所以 golang 就是一个 自相矛盾 自欺欺人的编程语言。
plqws
2016-01-27 23:05:35 +08:00
关于 err 的那个… js 有话要说:
if (!err)
 ...
  if (!err)
  ...
   if (!err)
   ...
    if (!err)
    ...
     if (!err)
banxi1988
2016-01-27 23:29:19 +08:00
怎么 Go Lover 和 Go Hater 在 Python 节点里开战了啊.
kingddc314
2016-01-28 00:21:50 +08:00
我觉得 Lua 的语法风格是我最喜欢的
TangMonk
2016-01-28 00:25:35 +08:00
RqPS6rhmP3Nyn3Tm
2016-01-28 01:53:05 +08:00
@GNiux Python 确实是一门很好的语言啊,我是先学 C 后学的 Python ,感觉还是挺有编程思维的。
julor
2016-01-28 07:33:37 +08:00
@noli 别的不说 c#不能很好的跑在 linux 吧?
zhangchioulin
2016-01-28 08:12:45 +08:00
@TangMonk 为什么是 ruby
mengzhuo
2016-01-28 08:24:30 +08:00
@noli

首先 Go 也可以写出 try catch 模式的代码,而且也可以获取执行栈的信息。具体你可以看看标准库里的 https://golang.org/pkg/runtime/debug/#PrintStack

为什么说不对 err 进行处理是偷懒的行为,那是因为一旦有了 catch ,程序员一般就全扔里面了,而且有时,一些“罕见”的错误需要停止程序运行,但是 catch 住了,你觉得还会有处理么?
再说,编译器在 catch 对每一种错误都进行判断和处理,那我为啥不直接返回值里一个个来呢?

1. 那么请问 async + task 算什么并发模型?是锁。不能简单地说锁和 csp 哪个好,但至少原生支持 csp 的总比拉着第三方库跑的在“语言层面”算是进步了吧?
2. 你还是误解了系统编程, go 的目标是 nginx haproxy ,那你说静态编译的 nginx haproxy 不能 hotfix 怎么办?单文件可以追溯所有的问题,包括第三方库。线上环境有时就是因为用的动态库版本不一致,导致出问题的,我司虽然没有,但是在开发环境里经常能碰到。
3. 大量使用 interface ? Golang 官方鼓励大家大量使用 generate 。 http://blog.golang.org/generate
4. 性能问题要看你怎么测试了,而且我说的是指令集的优化。
5. 我还知道 pep8 呢~然而并不能阻止组内的程序员继续写自己风格的东西。

最后关于 do_transaction 和错误处理,你可以看看这篇:
http://blog.golang.org/error-handling-and-go
而且你的做法是不对错误进行处理,不能怪语言。
ryanking8215
2016-01-28 08:43:37 +08:00
比较年轻的静态语言, golang, rust, swift, 语法上个人感觉 swift 最舒服。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/253629

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX