V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
fire5
V2EX  ›  Python

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

  •  
  •   fire5 · 2016-01-27 09:42:17 +08:00 · 21959 次点击
    这是一个创建于 3223 天前的主题,其中的信息可能已经有所发展或是发生改变。
    还是大 python 舒服。。
    第 1 条附言  ·  2016-02-04 14:43:15 +08:00
    这个话题的讨论方式偏离了很多。 如果为了讨论 golang ,@Livid 能否开一个 golang 的节点。感谢
    151 条回复    2016-02-09 21:30:09 +08:00
    1  2  
    est
        1
    est  
       2016-01-27 09:42:52 +08:00
    其他语法还好。异常处理那语法能让人崩溃
    bigtan
        2
    bigtan  
       2016-01-27 09:43:02 +08:00   ❤️ 2
    那是因为你还没看到 rust 的语法。
    xunuoi
        3
    xunuoi  
       2016-01-27 09:44:07 +08:00
    那是因为你还没看到 lisp 的语法。哈哈
    ahjdzx
        4
    ahjdzx  
       2016-01-27 09:47:19 +08:00 via iPhone
    习惯习惯就好了
    Shieffan
        5
    Shieffan  
       2016-01-27 09:49:53 +08:00   ❤️ 2
    if err!=nil

    if err!=nil

    if err!=nil

    if err!=nil

    if err!=nil

    if err!=nil

    ...
    mengzhuo
        6
    mengzhuo  
       2016-01-27 10:12:24 +08:00 via iPhone
    err=nil
    其实都是思路的问题, go 是门严谨的系统编程语言,想写得爽写 python js ruby 去!
    janxin
        7
    janxin  
       2016-01-27 10:12:56 +08:00
    反正看完 Rust 我又拿起了 C++11 继续看了...
    go2sleep
        8
    go2sleep  
       2016-01-27 10:13:48 +08:00
    @Shieffan +1 严重同意……
    golang 错误处理是最大痛点
    fire5
        9
    fire5  
    OP
       2016-01-27 10:16:18 +08:00
    认真的,其实 go 语法还行,中矩中规。 第一次写 iOS 应用的时候, objectc 是火星了我一吧,当然我的 os 水平,也是只说自己能写 app 而已。

    熟能生巧是关键。
    fire5
        10
    fire5  
    OP
       2016-01-27 10:16:38 +08:00
    @Shieffan 。。
    haoc
        11
    haoc  
       2016-01-27 10:18:32 +08:00
    真心痛苦,一个 lab 我写了几个月了就因为 go 这语法。。。
    ltttx
        12
    ltttx  
       2016-01-27 10:46:13 +08:00   ❤️ 1
    go 写多了,反而觉得没有大括号好痛苦
    bramblex
        13
    bramblex  
       2016-01-27 10:57:25 +08:00
    @mengzhuo

    带着 runtime 还好意思说 “系统编程语言” ?看看人家 rust 吧……
    bramblex
        14
    bramblex  
       2016-01-27 11:03:36 +08:00
    找一个你喜欢语言,然后找到这个语言的一个 Parser ,只要能转到 AST 就行了。
    然后把这个 AST 翻译到目标语言,比如说 Go ……

    结束,就那么简单。
    hqs123
        15
    hqs123  
       2016-01-27 11:04:17 +08:00
    慢慢来,会习惯的.
    loshine1992
        16
    loshine1992  
       2016-01-27 11:12:33 +08:00
    这个时候默念 Kotlin 大法好,默认空类型安全
    noli
        17
    noli  
       2016-01-27 11:31:07 +08:00
    @mengzhuo go 语言是门严谨的系统编程语言?
    请问你对于“严谨”的定义是什么,对“系统编程语言”的定义是什么?

    PS :你可以不理会我,因为我是 golang 黑。
    chrishine
        18
    chrishine  
       2016-01-27 11:41:16 +08:00   ❤️ 2
    if err != nil {} 根本不是黑点,自己不会包装一个 checkErr(err, vars...string) 函数么?如果这个意识都没,建议还是转行吧,产品经理之类的可能比较适合。

    go 的黑点在于:
    1 ,不支持泛型( go 官方说是尚未找到一个平衡点,但是当初就考虑不到么?)
    2 , map value 只能是值副本,不能对 map value 取址( go 官方说是 map 扩展,引用失效会如何。但是这个特性,我已经想去日藏獒了,哈士奇已经无法反映出我的内心。呐,谁让我没做过大型项目。)
    3 , go 脑残粉。

    微博上面曾经有人一句话吐槽过 go ,我觉得蛮不错的,拿过来分享:
    go 是一门很好的语言,没有不必要的抽象,但是连必要的也没有。
    fy
        19
    fy  
       2016-01-27 12:06:11 +08:00
    @chrishine 可啪,日狗也能分級,学到了新姿势
    zhujinliang
        20
    zhujinliang  
       2016-01-27 12:26:31 +08:00 via iPhone
    @chrishine map value 取址问题,再取一次址变通一下能不能行
    比如原来是 map[string]*T ,写成 map[string]**T 这样

    说真的不如语言支持范型, map list 之类的做成库就是了

    go 的包管理也有坑,只能自下向上引用,设计不好就出现循环引用了。之前跟一个 bug 粗看了一下 runtime.go ,发现 go 自己做这种底层组件时也不得不对 syscall 之类的包里本来有的函数又实现了一遍,这个包被其它所有包都引用,导致自己引用别的包就会出现循环引用错误
    tairan2006
        21
    tairan2006  
       2016-01-27 12:31:22 +08:00
    go 设计的有点过于简洁了…所以有些隐藏的坑。
    Rust 语法设计的过于复杂了,自从学过 C++后对这种玩意儿有点累感不爱, scala 也是。。
    htfy96
        22
    htfy96  
       2016-01-27 12:37:57 +08:00
    @chrishine +1 几个月前看 Go 的 JSON 库还是在用 interface{}作为 write 的参数,全部放在运行时搞,效率太低
    zts1993
        23
    zts1993  
       2016-01-27 12:53:27 +08:00
    go 的最大败笔 “ go 脑残粉 ” +10086
    hooluupog
        24
    hooluupog  
       2016-01-27 12:54:58 +08:00
    可能是更多的写静态类语言,不论是写 Go 还是当初写 python 都是很快就能上项目了。
    zhangchioulin
        25
    zhangchioulin  
       2016-01-27 12:58:56 +08:00
    @mengzhuo 我是 ios 开发,想多学门语言学习 go 还是 python?还是 ruby?
    chrishine
        26
    chrishine  
       2016-01-27 13:06:06 +08:00
    @zhujinliang 没试过这样,自己能做到的是修改以前的代码习惯。
    morefreeze
        27
    morefreeze  
       2016-01-27 13:57:25 +08:00
    @chrishine 求问如果我的函数总有个 error 返回值,而一般我在调用别的函数 if err != nil 我就直接 return err 这样的话 checkErr 咋写
    fire5
        28
    fire5  
    OP
       2016-01-27 14:22:08 +08:00
    @chrishine 但是这个特性,我已经想去日藏獒了。。。。。。。。。。。。。。。。。。。。。
    sox
        29
    sox  
       2016-01-27 14:23:32 +08:00
    脚本语言当然更容易让人习惯。。
    fire5
        30
    fire5  
    OP
       2016-01-27 14:24:03 +08:00
    @fy 同感
    chrishine
        31
    chrishine  
       2016-01-27 14:24:19 +08:00
    @morefreeze 我的话会 error 分级, switch case 决定是打印还是返回吧。
    不知道你这里 return err 是为何,返回的 err 会在另一个函数里面进行处理么。
    大概你是做集成之类的东西,有一个第三方库 A, B, C 等,用户 U 需要统一使用这些接口,所以不能处理 err ,只能将 A, B, C 的 err 继续抛给 U 让 U 去处理?除开类似的 facade ,我想不出为何要将 err 像 GPL
    一样病毒式扩散。
    chrishine
        32
    chrishine  
       2016-01-27 14:27:54 +08:00
    @chrishine 怎么 GPL 后面的文字另起了一行,虽然是想黑一下 GPL ,但也不想大写的黑一下。
    fire5
        33
    fire5  
    OP
       2016-01-27 14:33:38 +08:00
    @all 各位同学,这个话题不要讨论了。 吐槽下就行了,一不小心挑起语言之争,或者 python 大法好,意义不大。 感谢各位。
    JohnSmith
        34
    JohnSmith  
       2016-01-27 16:38:07 +08:00
    @chrishine 有道理。但是只要返回值有 error 就不能避免 if err != nil {},你说的是错误在哪处理的问题,不是错误处理方式的问题
    JohnSmith
        35
    JohnSmith  
       2016-01-27 16:43:47 +08:00
    @chrishine if err != nil {} 是一种形式,可以是 errHandle(err) or switch err{} ,根本原因是 error 做为值返回
    herozzm
        36
    herozzm  
       2016-01-27 16:47:07 +08:00 via Android
    个人感觉 go 比 Java 难学
    bobuick
        37
    bobuick  
       2016-01-27 17:25:55 +08:00   ❤️ 1
    @herozzm java 要是不了解那么一大堆设计模式, 当然是好学了。
    golang 的 if err != nil 这种, 你用自己的 errHandle(err)有什么鸟区别, 只是原来 3 行变一行而已, 一样到处都是。
    golang 我都是干脆 panic 处理,在外层做 recover , 自己写给自己调用的方法, 还特么 err nil 来 nil 去, 真是够了
    GNiux
        38
    GNiux  
       2016-01-27 18:06:01 +08:00 via iPhone
    正在上手 python ,赶脚这种脚本语言 用这么多模块……虽然上手迅速,但不易让人真正理解编程思维……

    其他语言才真正有料呵呵
    zongwan
        39
    zongwan  
       2016-01-27 18:17:36 +08:00
    有没有人觉得 golang 的 import 管理很麻烦?
    morefreeze
        40
    morefreeze  
       2016-01-27 18:32:35 +08:00
    @chrishine 我所在项目 大部分时候都是对于调用返回的 error 直接 return err 掉,我想这应该挺常见的,不管你这层怎么处理,当发生 error 时,可能之后就没法执行了,那你只能往上返回了,再往上报个错
    johnsneakers
        41
    johnsneakers  
       2016-01-27 18:32:49 +08:00
    @zongwan 不麻烦, sublime 装个插件 自动引用。 我已经好久没自己写引用了。
    cutepig49
        42
    cutepig49  
       2016-01-27 18:44:43 +08:00   ❤️ 4
    我就很喜欢 go 这种设计,浑身上下都透着憨直的傻气,不讲花招,没得商量,谁来都一样。
    3 个月 Go 经验的人写出来的代码中规中矩, 3 年 Go 经验的人也不会有什么奇技淫巧可以用。
    mengzhuo
        43
    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
        44
    mengzhuo  
       2016-01-27 19:27:31 +08:00   ❤️ 1
    p.s. 要说为什么我喜欢 Golang :
    1. Channel 可以很爽地刷多核。( Client.Write 不用上锁啊!!消息还是跨核传递的!!)
    2. 单文件解决所有问题、可以轻松部署(身为 Python 开发的我已经深深地迷上这点了)
    3. 工具链完备、各种分析很容易做,内存大部分不用管。(哪里慢点哪里!)
    4. 性能还不差,有赶超 C++的趋势( SSE 已经有了, AES Go1.6 支持了, AVX 、 FMA 也都会有的、嗯)
    5. 原生支持生产代码、风格统一、标准得很漂亮(租里都别吵了, go fmt/vet 一下就好)
    -----------
    以上几乎都是服务端开发中的痛点,如果这个语言服务端开发不看看的话,我觉得真的很遗憾。
    geew
        45
    geew  
       2016-01-27 19:33:02 +08:00
    最近也在写 也是各种槽点啊 那个混蛋说 go 适合 python 开发转的....我保证不打死他
    ethego
        46
    ethego  
       2016-01-27 19:34:31 +08:00
    @geew 写 python 的可以去看看 lua ,各种舒服,这是我最欣赏的语言
    Comdex
        47
    Comdex  
       2016-01-27 19:42:07 +08:00
    go 的 error 机制真的挺适合服务端的,要求你什么错误都得考虑,不像别的语言那样抛个异常就算了?
    penjianfeng
        48
    penjianfeng  
       2016-01-27 21:57:36 +08:00
    之前写 PHP,刚开始玩 go 的时候,啥?nil 是什么?类型居然在变量的后面定义?if/switch 居然不用括号?我用 PHP 几行代码就搞定的事儿用 go 写了一大堆,WTF!!!!然而....写了半个月,突然觉得好爽...严谨不失简洁,build 了时候就已经杜绝了很多 bug,test 写起来也很爽.我现在已经很少写 PHP 了...
    0987363
        49
    0987363  
       2016-01-27 22:13:03 +08:00
    不觉得,倒是觉得 python 语法反人类
    noli
        50
    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
        51
    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
        52
    plqws  
       2016-01-27 23:05:35 +08:00
    关于 err 的那个… js 有话要说:
    if (!err)
     ...
      if (!err)
      ...
       if (!err)
       ...
        if (!err)
        ...
         if (!err)
    banxi1988
        53
    banxi1988  
       2016-01-27 23:29:19 +08:00   ❤️ 1
    怎么 Go Lover 和 Go Hater 在 Python 节点里开战了啊.
    kingddc314
        54
    kingddc314  
       2016-01-28 00:21:50 +08:00 via Android
    我觉得 Lua 的语法风格是我最喜欢的
    TangMonk
        55
    TangMonk  
       2016-01-28 00:25:35 +08:00
    RqPS6rhmP3Nyn3Tm
        56
    RqPS6rhmP3Nyn3Tm  
       2016-01-28 01:53:05 +08:00 via iPad
    @GNiux Python 确实是一门很好的语言啊,我是先学 C 后学的 Python ,感觉还是挺有编程思维的。
    julor
        57
    julor  
       2016-01-28 07:33:37 +08:00 via Android
    @noli 别的不说 c#不能很好的跑在 linux 吧?
    zhangchioulin
        58
    zhangchioulin  
       2016-01-28 08:12:45 +08:00
    @TangMonk 为什么是 ruby
    mengzhuo
        59
    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
        60
    ryanking8215  
       2016-01-28 08:43:37 +08:00
    比较年轻的静态语言, golang, rust, swift, 语法上个人感觉 swift 最舒服。
    vietor
        61
    vietor  
       2016-01-28 08:45:04 +08:00 via Android
    go 的语法太古怪,比 Python 还古怪。
    missdeer
        62
    missdeer  
       2016-01-28 08:56:42 +08:00   ❤️ 3
    1 ,几乎各门主流语言都有大量脑残粉,这个不能成为黑的理由,太牵强
    2 ,泛型估计从开始到现在一直没找到满意的解决方案,只不过现在呼声太高,把缺陷放大了,实际上写业务代码的对泛型的需求并不是特别强烈,写库的才有需求
    3 ,包管理真纠结
    4 ,批判代码风格问题的人,一般都是太自我中心的人
    jjx
        63
    jjx  
       2016-01-28 09:14:01 +08:00
    golang 的 error 要看你用什么角度去看, 如果你是用 c /lua 这样的, 那么 golang 的 error 只有改进

    但是一定要同 python/c#/java 的 try/exception 机制去比, 就陷入脑残粉的怪圈了

    github 有很多对错误改进的库,比方说 github.com/juju/errors, 其中就反映了 error 的不足

    比方说 errors.Trace 方法, 会在原来的 err 对象上再增加代码行, 比方说 errors.Annotate 会在原来的 err 上增加描述, 比方说我现在看到到一个 orm 库 gorm, 它在找不到记录时返回的异常都是 record not found, 如果代码中有多行返回这个异常, 不在原来的错误添加描述而是直接返回其异常是没有办法定位的


    这里还要吐槽一下 golang 的错误堆栈, 同 python 完全没法比, 用过的人自有体会

    上面有兄弟说到 try/catch, 服务器端开发其实不 catch 异常的, 都是直接抛出, 最多捕获一般也是在发送给客户端时捕获一下,然后打印异常到日志, 也就是说有些不正常的情况是依赖系统或库抛出的异常的, 比方说查询时 sql 用了一个字段名打错了,python/java 之类的不会在这行中取捕获这种异常, 但 golang 就一定要, 否则出错在就在下面的行, 让你莫名其妙

    最后别信 golang 的开发效率, 同 python 比是完全不可能的, 拿关键的 orm 而言, 没有一个库的设计能同 sqlalchemy 这种设计高度相提并论的, 在开发数据库应用时,会很痛苦.
    chai2010
        64
    chai2010  
       2016-01-28 09:14:39 +08:00
    @noli err 要携带上下文信息很好实现,我自己就包了一个(不过今天只能看到独角兽了):
    https://github.com/chai2010/errors


    panic 也可以当作一种异常,只是被故意设计的很难用。
    这是为了防止 panic 被滥用。
    clino
        65
    clino  
       2016-01-28 09:24:12 +08:00
    我就一个问题为什么发在 python 版...
    jjx
        66
    jjx  
       2016-01-28 09:24:19 +08:00
    另外, golang 的古怪的地方是

    虽然 golang 有闭包, 但官方其实不建议闭包当做类似 python 的 lambda 用的, 像, 类似

    filter(ATypecol, func (item AType ) bool { return true})

    这样的用法是不建议的, 而是推荐你用循环

    类似于 do in transaction, 按 java 系的写法就是

    session: = db.Begin()

    err := func (session *gorm.DB) error {

    return nil

    }

    if err != nil{
    session.Rollback()
    return err
    }
    session.Commit()

    但一般也不建议这样用, 而是老老实实的每次 crud 时

    if err != nil{
    session.Rollback()
    return err
    }

    一个复杂的事物中, session.Rollback(); 会重复 n 次, 处女座绝对不能忍
    jjx
        67
    jjx  
       2016-01-28 09:25:18 +08:00
    err := func (session *gorm.DB) error {

    return nil

    } (session)

    打错了
    iburu
        68
    iburu  
       2016-01-28 09:26:17 +08:00
    scala 大法好
    x87648510
        69
    x87648510  
       2016-01-28 09:30:02 +08:00
    @Shieffan +1 严重同意……
    chai2010
        70
    chai2010  
       2016-01-28 09:31:25 +08:00   ❤️ 1
    @jjx 看场景吧,标准库也有类似的用法:
    https://godoc.org/strings#TrimFunc
    bobuick
        71
    bobuick  
       2016-01-28 09:38:43 +08:00
    @jjx +1
    lance26
        72
    lance26  
       2016-01-28 09:39:53 +08:00
    @banxi1988 sigh
    nydus123
        73
    nydus123  
       2016-01-28 09:42:55 +08:00 via iPhone
    为了楼主自己的感受挑起语言之争真不值得;那些就写了几个 demo ,看了点语法介绍连 effective go 都没看完的人有啥好和争论的;每个语言都有缺点,在特定方向上瑕不掩瑜就好了。
    bramblex
        74
    bramblex  
       2016-01-28 10:41:39 +08:00
    Haskell 教徒笑而不语
    noli
        75
    noli  
       2016-01-28 10:55:53 +08:00   ❤️ 2
    @julor

    区区在下最近恰好在 linux 上用 mono 写 C#,商用的, JIT 也可以 AOT 也可以,所有的 C# 特性已经 mscorelib 都支持。 所以,对于跨平台这一点的疑问,自己可以去看 mono 官网。

    @mengzhuo

    你了解到的 async + Task 是什么?为什么不是并发模型? async + task 这些甚至是语言自带的。

    async 关键字让异步方法可以被编译器改写,避免了回调嵌套,这点跟 go 用 goroutine 带来的优势是一样的,无论从性能还是从代码可读性的角度来说都是一样的,甚至异步模型能够使用比 coroutine 栈更精确的内存使用量; Task 自带线程池跑异步任务,用的是系统级的线程调度,一样也是在任何需要的地方(甚至不局限于 IO )自动让出 CPU 使用权,这跟 goroutine 也是一样的;

    而 go 必须要使用 channel 或者其他同步原语才能明确交出控制权,遇到 CPU 密集的计算你甚至没办法手工分派到低优先级队列,这跟 C# 全方位的控制真是差远了,至少用 C# 你还可以指定线程池策略。在这一点上 go 还真是没办法自称系统编程语言,隐藏了太多重要的底层细节不让程序员使用。

    加锁问题?这个跟语言没有任何关系, go 不需要加锁的地方 C# 一样也不需要,这是业务决定的。甚至用 C# 你还可以在编译器层面保证所有其他项目参与者,使用设计良好的 actor 模型,完全无锁。这是 golang 这种弱爆了的编译器没法要求其他参与者做到的。

    2. 单文件可以追溯所有的问题 ? 你肯定没遇到过静态链接的坑吧,请问 golang 用了什么不一样的原理使得它跟以前的链接模式有所区别?甚至比以前要退步了,因为只能在有源码的情况下链接。

    你要问 C#, Dll Hell 早就是历史了,因为你可以自己对第三方库的版本做 code sign ,不一致的第三方库版本,哪怕你 *没*有*源*码* 你都可以在静态链接或者动态链接的阶段发现出来。

    不要以为有个什么包管理工具就可以趟过坑了,这种根本就是语言设计层面的问题。看看现在 go 又有多少个第三方包管理程序就知道, go 根本就没解决过这种问题。

    3. 大量使用 interface 不是一个个人问题,而是社区问题,只要你语言里面有这样的东西,就会倾向于被各种低级程序员滥用。不过也确实, golang 也就只能吸引这部分人了吧。

    4. 编译成原生代码根本就不是什么屌渣天的事情。 Tracing JIT 甚至可以为长期运行的程序优化生成比从 C++ 编译出来更快的原生代码,信不信由你。

    5. 你知道 PEP8 就好,再也不要迷信什么大括号啊,缩进啊,都要搞成语言标准的东西了,用 clang-format 这种基于语法分析的工具来优化代码格式,而不是靠什么语法层面约束来制造麻烦。

    @chai2010

    正如 @mengzhuo 说的,任何语言都“不能阻止组内的程序员继续写自己风格的东西。 ” 你今天重新发明一个 类似与 exception 之类的东西,明天又有别人发明一个,然后使用 不同 的重新发明过的 exception 写成不一样的 第三方库,然后你就指望一个程序里面可以好好地 handle 这些不一样的 exception 吧。

    这就是弱鸡语言的全部故事。
    noli
        76
    noli  
       2016-01-28 11:14:27 +08:00
    @mengzhuo

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

    1. 全部 catch 不处理,偷懒的是程序员。
    2. 返回 err 一个一个来? 还是我说的,在 do_transaction 这样的函数里面的问题,如果我里面返回了不定多个 err ,你怎样一个一个来? 这时候偷懒的是编译器,语言。
    kelvinji2009
        77
    kelvinji2009  
       2016-01-28 11:15:01 +08:00
    真是奇怪了。。。怎么又来语言大战?哪有语言是完美的?
    noli
        78
    noli  
       2016-01-28 11:36:47 +08:00
    @kelvinji2009 主要是某些用低等语言的人总是秀优越感,让人心烦。

    像用 C++ 这样的就没有机会秀优越感了,一个个都老实得不得了。

    然后,阻止那些用“战术上勤奋的语言”作恶毁掉程序员人才库,是我等学院派和语言卫道士的终生追求。

    再者,技术崇拜和技术歧视,是一样脑残。我就喜欢打那些捧 google 臭脚人的脸,把所有微软技术视作邪恶来源的,也是逗逼。

    最后,憋一个作品之后再出来爽,这样实在太漫长了,还是放个嘴炮又快又舒服。
    mengzhuo
        79
    mengzhuo  
       2016-01-28 12:54:02 +08:00
    @noli

    本来写了很多技术讨论的东西,但是人身攻击已经开始了,我也就不回了
    EOF
    ghostsf
        80
    ghostsf  
       2016-01-28 13:13:17 +08:00
    @xunuoi 哈哈 +1
    defia
        81
    defia  
       2016-01-28 13:13:32 +08:00
    @chai2010 看了一下您的 error 库,我觉得可以参考一下 https://gowalker.org/github.com/ansel1/merry,封装一个 WithValue
    ghostsf
        82
    ghostsf  
       2016-01-28 13:14:38 +08:00
    评论 不错 mark
    CRVV
        83
    CRVV  
       2016-01-28 13:30:00 +08:00 via Android   ❤️ 1
    @noli
    具体的我就说一点, Go 的 gc 编译器在默认情况下做静态链接,而不是 Go 语言不支持动态链接

    Go 是个特点鲜明的语言,必然有人喜欢有人不喜欢
    喜欢什么语言就用什么语言,又没人逼你拿 Go 写代码

    所以吧,建议 noli 这种上来就知道乱喷的傻逼,最好悄悄在旁边待着别吭声了
    bystand3r
        84
    bystand3r  
       2016-01-28 14:25:29 +08:00
    板凳瓜子已就位
    noli
        85
    noli  
       2016-01-28 14:28:29 +08:00
    @CRRV

    上来就乱喷的是你吧,好歹我也装作有技术含量地写了几千字和一个 case 。
    不过,作为一个同在喷的人,我不介意你什么时候喷。

    不过喷的姿势麻烦端正一点好不好?逼格显得太 low 我会不屑与你同喷的。

    说一堆辩证法下正确的话有什么意义吗?什么东西不是有人喜欢有人不喜欢?
    是不是只有喜欢的人才能喷,不喜欢的请闭嘴?如果这是你家,我同意你的立场。
    但是,作为一个(伪)学院派,任何反理性的做法,我是肯定要喷的。
    不用 go 语言就不能批评 go 吗? go 培养脑残我就是要喷。

    其实我是知道 go 的编译器能生成 SO , 1.5 正式支持嘛,但无奈有人声称单文件最好,那我只好降维攻击了。

    说正题,你说 go 的编译器能支持动态链接,能生成 动态链接库,是对的。

    但这并不等于说, go 语言自身 *已*经* 支持 *动态加载* Dynamic Link vs Dynamic Load 。

    譬如说 C , C 语言是通过系统 API 来完成动态库加载的,动态库更新了, free 掉再 load ,就可以执行新的动态库的功能。

    又譬如 C# Java C++ ,当然也是支持的,在同一个进程的声明周期内反反复复加载不同的动态库。


    好了,轮到你了,你说 Go 支持动态加载吗?—— 除非你说自己写个解释器吧……
    yougg
        87
    yougg  
       2016-01-28 14:41:36 +08:00
    脑残粉 只是自己在粉 Go 而已,
    脑残黑 缺在这里搞人身攻击.

    高下自判.
    TangMonk
        88
    TangMonk  
       2016-01-28 14:48:57 +08:00
    @zhangchioulin go 比较底层, 对刚开始做服务端开发的初学者不太适合。 python 不够极致, 缩进, python2 和 python3 的坑。所以就 ruby 了
    noli
        89
    noli  
       2016-01-28 15:01:10 +08:00
    @yougg

    如果说骂人两句说他蠢会把人骂死的话…… 那活该啊!哈哈哈哈

    弱者躲在理想的道德世界里沾沾自喜,也就只能喷一下敢出头的人来寻找无聊的优越感了。

    话说,虽说我的用词很有攻击性,但要说我是人身攻击,我是不会承认的,因为我既没有评判讨论者的道德水平,也没有故意偏离讨论的话题来试图夺取话语权。

    然后,继续你的道德审判吧——你这种反而比较像人身攻击,知道不?
    moro
        90
    moro  
       2016-01-28 15:06:42 +08:00
    zhangchioulin
        91
    zhangchioulin  
       2016-01-28 15:14:36 +08:00
    @TangMonk 敢问兄台学的是 ruby 还是 go ? ruby 或者 go 的话如果让我学我可能会选择 go 。
    go 的工作好找吗? ruby 呢
    elvodn
        92
    elvodn  
       2016-01-28 16:35:02 +08:00
    yougg
        93
    yougg  
       2016-01-29 09:02:19 +08:00
    @noli
    又见到一个自以为是,以自我我中心的人.
    V2 上怎么这么多双重标准玩的 666 的人.

    骂别人就是活该, 理所应当.
    就见不得别人反对他的观点.

    无论自己的言行多么出格都是政治正确的, 人身攻击都能说得冠冕堂皇.

    要讨论技术就好好的讨论技术本身不就行了, 自己论不过了还给"降维打击"找一堆理由.


    呵呵呵, 补充 block list.
    noli
        94
    noli  
       2016-01-29 09:18:12 +08:00
    @yougg 嘿嘿,你说我双重标准。

    那要不我发个参考标准出来,你看看有没有道理,看看谁比较像人身攻击?

    https://www.zhihu.com/question/20519813
    TangMonk
        95
    TangMonk  
       2016-01-29 09:55:50 +08:00
    @zhangchioulin 我是做 ruby 的。。如果是为了工作的话还是不要选 ruby 。。
    BurNFans
        96
    BurNFans  
       2016-01-29 13:11:48 +08:00
    @noli error 不处理会 crash ?用过 go? panic 不 recover 才会 crash 好么?连 erroc 和 panic 都区分不了,就在这里评价?
    noli
        97
    noli  
       2016-01-29 13:17:08 +08:00
    @BurNFans

    你从哪里得到“我认为 golang 里面有 err 会直接导致 crash ” 这种印象?
    你连我说了什么都没弄清楚,这种水平?还是先跟我学学怎么做喷子好不好?
    noli
        98
    noli  
       2016-01-29 13:19:30 +08:00
    @BurNFans

    为了表达我可以收你为徒弟的诚意,我说的而且可能导致你理解有偏差的话在这里
    “你还要手工去分析 err 的各种可能性,否则漏了一个的话,你就会惊喜的看到上线后不定期 crash ”

    你喷吧。
    BurNFans
        99
    BurNFans  
       2016-01-29 13:21:11 +08:00
    @noli
    引用自你的原话:
    “ 1. 把 err 都放到一个值返回出去做检查,请问这样跟 catch 掩盖错误有什么区别吗?然后,如果你不想程序轻易当掉的话,你还要手工去分析 err 的各种可能性,否则漏了一个的话,你就会惊喜的看到上线后不定期 crash ……”
    BurNFans
        100
    BurNFans  
       2016-01-29 13:22:55 +08:00
    @noli
    为什么是可能导致?来来,你说说,该怎么理解你这句奇怪的话
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2732 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 12:44 · PVG 20:44 · LAX 04:44 · JFK 07:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.