V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
banxi1988
V2EX  ›  Go 编程语言

Go 与 泛型: 优点 or 缺陷

  •  2
     
  •   banxi1988 ·
    banxi1988 · 2017-02-08 09:26:18 +08:00 · 8927 次点击
    这是一个创建于 2835 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前看到 Go 中国 的文章: 为什么说 2017 年你必须要学习 Go 了

    其中把 Go 语言没有泛型作为其优点之一.

    昨天晚上看到新发的文章: Russ Cox 的 2017 年 Go 开发计划

    注: Russ Cox 目前是 Go Team 的 leader

    其中对于泛型有这么一两句话:

    我不相信 Go 团队曾经说过“ Go 不需要泛型”

    但我们确实明白,对于 Go 来说缺乏参数多态性是一个显著的障碍。

    这样看来, 在 Go 开发团队眼中, Go 没有泛型并不是一个优点啊.

    128 条回复    2017-02-13 20:01:55 +08:00
    1  2  
    mooncakejs
        1
    mooncakejs  
       2017-02-08 09:33:03 +08:00 via iPad
    王婆卖瓜
    zonyitoo
        2
    zonyitoo  
       2017-02-08 09:33:54 +08:00
    中国的 Go 开发者把 Go 的所有缺点都当作优点来分析
    plqws
        3
    plqws  
       2017-02-08 09:35:14 +08:00
    国内 Go 开发者看不到 Go 的真正优点,倒是喜欢反驳别人有理有据的喷点。
    yegle
        4
    yegle  
       2017-02-08 09:42:31 +08:00
    绝大多数泛型可以用代码生成来代替?
    weiweiwitch
        5
    weiweiwitch  
       2017-02-08 09:42:57 +08:00
    文章里面列的好多问题都是我现在项目开发中遇到的呀!真的写的好痛苦啊。

    “泛型将在今年引入”,这句看的好伤心呀!

    希望包管理能在今年引入吧。
    weiweiwitch
        6
    weiweiwitch  
       2017-02-08 09:45:38 +08:00
    @yegle 这个无形中增加了大量的代码呀。而且未来要修改一些机制,势必要重新生成什么的。遇到一些需要类型信息才能选择和判断的功能,也不太好实现呀。
    echo1937
        7
    echo1937  
       2017-02-08 09:47:00 +08:00 via iPhone
    @weiweiwitch 原文是“我不认为泛型将在今年引入”……
    weiweiwitch
        8
    weiweiwitch  
       2017-02-08 09:54:57 +08:00
    @echo1937 少贴了几个字,反正都是说泛型今年不会出来,所以我们项目是等不来泛型了。
    qianguozheng
        9
    qianguozheng  
       2017-02-08 10:03:38 +08:00
    当然要看原文。 你这个都是别人理解的文章或者翻译的文章。 一点出入很正常。
    从我的观点来看,是否有泛型不重要,重要的是你遇到了什么是必须要泛型的吗?
    fatedier
        10
    fatedier  
       2017-02-08 10:04:56 +08:00
    @yegle 看了一些项目目前确实是这么做的,一般会通过 go generate 来生成,但是代码基本上可读性就比较差了。
    Gem
        11
    Gem  
       2017-02-08 10:15:42 +08:00
    最希望的是 |--->! 包管理器 !<---|
    weiweiwitch
        12
    weiweiwitch  
       2017-02-08 10:24:33 +08:00
    @qianguozheng 我们对泛型的需求和文章中提到的差不多,即借助泛型来实现一些特殊需要的通用数据结构或算法。没有泛型的话,代码多了不说,更主要是容易引发转型的 bug 。


    @Gem 其实这个我也是不太抱希望的。现在已经有一些可用的包管理器了,但最大的问题是有好多开源包并没有按照语义化版本来发布。这个要规范起来也需要很长的时间。
    Gem
        13
    Gem  
       2017-02-08 10:26:29 +08:00
    @weiweiwitch 对的,主要是要官方的一个包管理规范。
    ljy2010a
        14
    ljy2010a  
       2017-02-08 10:34:54 +08:00
    包管理可以看下这里 : https://github.com/golang/dep
    kappa
        15
    kappa  
       2017-02-08 11:13:13 +08:00
    rsc 什么时候当上 Go Team 的 leader 了?
    mengzhuo
        16
    mengzhuo  
       2017-02-08 11:21:23 +08:00
    @fatedier go generate 的质量也是和人有关。
    noli
        17
    noli  
       2017-02-08 11:57:32 +08:00   ❤️ 1
    golang 的能力相比 C# 加上 AOT 之后,优势就所剩无几……
    C# 在跨平台开发上还有 Xamarin 之类的撑一下场面
    golang 除了写 业务 server 之外,没有想到任何别的场合是能用的。
    hjc4869
        18
    hjc4869  
       2017-02-08 12:01:31 +08:00 via Android
    golang 这个语言的 feature 缺失让我怀疑为什么到了 2017 年还有人在用它……
    CRVV
        19
    CRVV  
       2017-02-08 12:02:37 +08:00
    @noli
    我觉得 docker 还不错,至少能用
    Go 的编译器我也用着没发现有什么问题

    这俩不算 “业务 server ” 吧?
    CRVV
        20
    CRVV  
       2017-02-08 12:13:11 +08:00
    @hjc4869

    这话怎么这么奇怪

    C, C++, C#, Java, JavaScript, Python, Ruby, Haskell 都缺失了 Common Lisp 的宏
    Common Lisp 缺失了 Haskell 的 Type Inference


    请问 2017 年应该用什么语言?
    noli
        21
    noli  
       2017-02-08 12:21:00 +08:00   ❤️ 1
    @CRVV

    要这么说的话……那应该 C/C++是世界上最好的语言?毕竟 Linux , Windows 都是用它们写的。
    golang 有什么特点可以说明 docker 这样的软件用它来写是最好的呢?
    我觉得只有“适逢其时” 这一点了。

    话说, Mono 或者 .NET runtime 本身就是一个 可以自行隔离多个组件的 VM 呢,
    C# 的动态加载 API 也能支持这一点,这难道不比 golang 屌么
    shawngao
        22
    shawngao  
       2017-02-08 12:23:17 +08:00
    一门语言就应该包罗万象么?
    每个语言都有自己的优缺点吧!
    如果不能忍就自己写一门语言吧!
    CRVV
        23
    CRVV  
       2017-02-08 12:29:03 +08:00
    @noli

    我仅仅是回复了 “ golang 除了写 业务 server 之外,没有想到任何别的场合是能用的” ,表达一下 Go 还有其它的场合“能用” 而已

    我没说 Go 在这两个场合好用,我也没说它是一个好语言,我也没说它比任何一个语言好

    你这回复得莫名其妙
    jarlyyn
        24
    jarlyyn  
       2017-02-08 12:47:09 +08:00
    @noli

    最近用下来, golang 是一门不错的语言。一定要让我在 golang 和 c#中放弃一门语言(注意,不是选择)的话,我肯定选择 C#。

    golang 能做什么?什么只能用 golang 来做?

    这个世界有这么多门语言,有什么是只能用一门语言来做的吗?

    没有一个语言是最好的。

    golang 现在编译快,概念少,有 GC ,明显 直接 的竞争对手是部分脚本语言的领域。

    静态理性,部署容易,性能略高。

    我用 golang 是用来代替了很多我本来用 Python 甚至 Nodejs 做的事情而已。

    至于为什么放弃 C#,还有比 c#更 尴尬 的语言吗? c#似乎在哪个领域都做不到老大?

    说句不好听的。只能用一门语言来完成工作处理问题的,还能叫程序员?

    既然要学多门语言,易学部署容易的优势还不够大吗?
    noli
        25
    noli  
       2017-02-08 12:50:14 +08:00   ❤️ 1
    @CRVV 我的意思是,这个世界并不需要到处都需要重新实现写一个 docker ,但是到处都需要写业务服务器,到处都需要 OS 。更重要的是, docker 作为一个具体的软件是可替代的。但是业务服务器作为一个广义需求是无法被替代的。所以,我的意思就是,你举 docker 这个例子来试图说明“ golang 有别的场合能用”,我也是觉得怪怪得,因为 docker 本身并不代表一个 场合。
    husinhu
        26
    husinhu  
       2017-02-08 12:58:08 +08:00
    Golang blog 在 2010 年就说过了,尤其最后一句 - "我们写了越多的 Go ,就越发现不需要这个 feature"

    Do you have plans to implement generics? Many proposals for generics-like features have been mooted both publicly and internally, but as yet we haven't found a proposal that is consistent with the rest of the language. We think that one of Go's key strengths is its simplicity, so we are wary of introducing new features that might make the language more difficult to understand. Additionally, the more Go code we write (and thus the better we learn how to write Go code ourselves), the less we feel the need for such a language feature.
    noli
        27
    noli  
       2017-02-08 12:58:13 +08:00   ❤️ 1
    @jarlyyn 我觉得很多人在讨论语言的时候,经常会陷入一个思维误区。
    不存在“世界上最好的语言” -> 语言之间没有优劣之分。 请问这个推导你认为成立吗?
    我认为不成立。

    C# 部署难吗,有 .net 就 .net , 有 mono 就 mono , 两个都没有,我还能 AOT 成本地二进制。部署难吗?

    C# 尴尬吗? 如果做不到老大就尴尬,那么 golang 应该跟着一起尴尬吧? golang 在哪个领域做到老大了? 高性能服务器依然是 C++ 为主流,复杂的大规模服务 Java 是主流,请问你 golang 算老几?

    说句不好听的,能用一门语言解决问题,为什么要用多门语言? C# 能搞定 PC 端,移动端,服务端,浏览器端,为什么要多搞几个人?

    当然啦,我也不是介意多学 几门语言,然而学了几门语言之后还想一头扎进 golang 的话,那真是没悟性。
    jarlyyn
        28
    jarlyyn  
       2017-02-08 13:07:42 +08:00   ❤️ 1
    @noli

    我认为语言之间当然没有优劣之分,只有适合不适合。

    部署和 golang 比,非常难。

    能用多门语言。为什么要用一门?好好写过程序就知道了,一门语言搞定所有,大概你一个 shell 能搞定的事情也准备起个 c#?问得出这个问题的绝对属于思路精奇啊。

    c#作为一个 java 的 copy 者和竞争者,现在混成这样还不尴尬?
    noli
        29
    noli  
       2017-02-08 13:15:30 +08:00 via iPhone   ❤️ 1
    @jarlyyn c#是 copy java 这样的话你也说得出,怪不得你认为语言没有优劣之分。

    你自认为是码农就算了,不要把所有研究编程语言理论抽象符号运算等等问题的人当成是没事找事干。

    降维攻击你赢了
    hjc4869
        30
    hjc4869  
       2017-02-08 13:17:01 +08:00
    @jarlyyn .NET Core 直接 publish 一个目录就能拷到 Linux 下运行,环境也不需要装。没看出来比起 golang 哪里“非常难”了。
    jarlyyn
        31
    jarlyyn  
       2017-02-08 13:18:34 +08:00
    @noli

    先说是不是,再说为什么。

    你让为不是,就说明吧。
    gamexg
        32
    gamexg  
       2017-02-08 13:19:00 +08:00
    @noli 多年没接触 c# 了,现在 mono 生产环境工作正常吗?图形界面能够在 linux 下工作了吗?如果.net linux 支持做好就非常棒了。
    .NET 的问题感觉出在微软主导,我记得当时 mono 还被告了,要求贡献 mono 代码的人不能看过 .NET 的反编译。这么做使人对 .NET 跨平台兼容没信心,不知道什么时候 mono 就被微软搞死了。


    没有泛型支持一直不是优点, go 官方打算加泛型,结果因为历史遗留问题很难加...

    另外错误部分也比较坑,像是标准库网络错误,想要确定具体的错误类型居然要用字符串查找...

    个人感觉 go 适合服务端编程,写起来很省心,没有回调地狱模式问题。另外写一些小的服务器工具也是合适的,但是图形界面部分不好用,或者说是我没接触 go 图形界面编程。
    hjc4869
        33
    hjc4869  
       2017-02-08 13:22:14 +08:00   ❤️ 1
    @gamexg 然而现在 Xamarin(mono)都被微软收购了,开发速度、代码质量在过去一年内也有显著的提升(虽说貌似有大把大把地抄微软开源的 .NET Core 和 .NET reference source ),你还觉得它会死吗?
    noli
        34
    noli  
       2017-02-08 13:22:47 +08:00 via iPhone
    @jarlyyn 那你说 linq 是抄了 java 的什么, async await 抄了谁, yield return 又抄了 java 哪些特性?
    jarlyyn
        35
    jarlyyn  
       2017-02-08 13:23:16 +08:00   ❤️ 1
    @gamexg

    C#和 mono/.net 是两个问题。

    图形界面不是 C#原生的内容,用 gtk#/qt 之类的跨平台是没什么问题的。 mono 刚出来的时候做跨平台的 ui 程序就很容易没什么问题。
    jarlyyn
        36
    jarlyyn  
       2017-02-08 13:27:22 +08:00
    @noli

    说的出这些话的还好意思说什么降维攻击?

    看清楚我原话了吗?

    Copy 和竞争者。

    c#和 JAVA 的关系,和语言中的那些细节有什么关系?

    谁关心语言的细节了?正常人都是关心的应用场景,谢谢。
    noli
        37
    noli  
       2017-02-08 13:34:13 +08:00   ❤️ 1
    @jarlyyn 无耻之尤。 我说了 C# 里面有 而 Java 没有的东西来证明非 copy ,你却跟我说不关心细节~ 那你 golang 不也是 copy C 语言吗,谁关心语言细节了?

    关心应用场景?好啊,那你说说 golang 怎么写 各种平台上的 GUI 应用啊?
    gamexg
        38
    gamexg  
       2017-02-08 13:39:02 +08:00
    @hjc4869 Xamarin 有印象,记得看 keepass android 源码时发现的,当时想编译下 keepass 发现连免费试用都没有就没再看。现在看好像有免费社区版了。 当时 keepass 的几个实现大部分都是 .NET 的实现,唯一一个纯 java 的实现比.NET 的实现慢了很多...

    @jarlyyn 问题是一般 vs.net 就用 windows 的实现,后期再改好麻烦...

    现在 .NET 小图形界面做 windows + linux + macos 跨平台用哪个方案方便?
    所谓的图形界面就是封装一个控制台程序,只用有启动、停止、重新启动按钮外加重定向控制台输出到图形界面文本框。
    是不是 mono+aot 后就不用部署 .net 运行时了?
    jarlyyn
        39
    jarlyyn  
       2017-02-08 13:39:05 +08:00
    @noli

    golang 和 C 的应用场景不一样啊。

    当然, golang 不是一直目标是 Better C 么。有谁说 golang 和 C 是没关系的么?不是都在把 golang 往 C 身上靠的么。到底是谁无耻,呵呵。

    其次。

    撇开那些绑定库不提,我一贯喜欢丢个 webkit 库直接用 Html 写,有什么问题么?

    连 js 都能用来写各种 gui 程序了(比如 vscode,atom )

    你到底在想啥?
    jarlyyn
        40
    jarlyyn  
       2017-02-08 13:42:10 +08:00   ❤️ 1
    @gamexg


    可怜我只写过 Mono devaloper 的 gui 到 win 上用,没怎么写过 win 下的 GUI 程序。 windows 下用 c# 主要还是网络相关的。
    noli
        41
    noli  
       2017-02-08 13:45:37 +08:00   ❤️ 2
    @gamexg

    我司线上服务器用 mono 已经很久了。
    如果你说 C# GUI 开发就是指 WPF 之类的话,这当然是没有的。
    但是 xamarin studio 本身就是一个很好的 C# 跨平台 GUI 开发的例子。
    scnace
        42
    scnace  
       2017-02-08 13:48:23 +08:00 via Android
    noli
        43
    noli  
       2017-02-08 13:57:17 +08:00   ❤️ 1
    @jarlyyn 一方面说语言没有优劣, 然而 golang 又自称以 better C 为目标,你们 gopher 真心精神分裂啊。

    既然 golang 以 better C 为目标,那现在混成这样也挺尴尬的,嵌入式也用不了,高性能也比不上,说广泛使用吧也不如 Java 。除了有一个三心二意的爹之外一无是处啊。

    golang 有啥有资格看不起 C# 么? 做 3D 有 Unity ,做跨平台 GUI GTK#, Bridge.Net 把 C# 编译成原生 Javascript ,这样的话连 HTML 都不用写,不想装运行时可以 AOT 。 你 golang 连个 hot fix 都解决不了,真不知道有啥好吹牛的。
    scnace
        44
    scnace  
       2017-02-08 13:58:37 +08:00 via Android
    ↑↑怎么每次有 Go 的话题 都会跟其他语言打起来?(你们其他语言这样吗?
    CRVV
        45
    CRVV  
       2017-02-08 14:01:28 +08:00   ❤️ 2
    @gamexg

    "另外错误部分也比较坑,像是标准库网络错误,想要确定具体的错误类型居然要用字符串查找... "

    1. 字符串查找是错误的方法,因为返回的字符串依赖于操作系统和操作系统的语言设置

    2. 同样的错误,不同的操作系统会返回不同的结果,有的错误只存在于部分操作系统上,如果要做一个完全和操作系统无关的 net 库,这个问题就很难解决.

    比如 Java 的 ‘ new ServerSocket()’ 会抛 java.net.BindException ,这个异常的原因可能是 EADDRINUSE 或者 EACCES ,也区分不出来

    3. 2 里的例子,用 Go 可以区分,只是比较麻烦,并且依赖于特定的 Go 版本。能在 1.7 上用的代码是

    ```
    _, err := net.Listen("tcp", "localhost:123")
    if opErr, ok := err.(*net.OpError); ok {
    if syscallErr, ok := opErr.Err.(*os.SyscallError); ok {
    if errNo, ok := syscallErr.Err.(syscall.Errno); ok {
    switch errNo {
    case unix.EADDRINUSE:
    println("EADDRINUSE")
    case unix.EACCES:
    println("EACCES")
    }
    }
    }
    }
    ```

    结论是,这不是 Go 的问题
    fatedier
        46
    fatedier  
       2017-02-08 14:03:06 +08:00
    @noli C# 很好,但我发现一些公司因为招不到足够多靠谱的 C# 程序员而正在选择转 Go ,这一点值得注意。大部分使用 Go 的公司,程序员都是从 c++ 之类的转过去的,相对来说容易很多。
    jarlyyn
        47
    jarlyyn  
       2017-02-08 14:10:25 +08:00
    @noli

    better C 本来就是试图在 C 用的场景上做的更好啊。

    至于 C 和 golang 哪个应用的更广泛,在大部分场景中更有优势,自然是 C 啊。

    只有你在这里看得起看不起啊,我之前就说过我也写过 c#,难道我还看不起我自己么?

    至于吹不吹的。

    go 吹的数量能和 php 吹, c#吹, java 吹比么……
    gamexg
        48
    gamexg  
       2017-02-08 14:13:01 +08:00
    @CRVV 我记得当时也尝试过这种,但是跟进去发现中间错误类型是 net 库私有类型,再拷贝出来强制转换麻烦,而且标准库变更结构的话程序会挂。

    查询网上没什么好的解决办法, go 本身就不建议程序区分错误类型,用的又不多,就直接字符串查找了。
    noli
        49
    noli  
       2017-02-08 14:16:57 +08:00 via iPhone   ❤️ 1
    @fatedier 这是另外一个话题了。老板都想招到即插即用到岗马上能干活的程序员,但技术变化那么快,抱有这种把人当机器的想法当然是事倍功半的。 能好好写 golang 避免不必要的 copy ,避免过迟 defer 的你以为很多么?
    noli
        50
    noli  
       2017-02-08 14:27:18 +08:00   ❤️ 2
    @jarlyyn golang 吹 v2 上特别多。其实吹也不是什么问题, php 吹通常承认自己懂得不多, Java 吹也比较老实不吹语言特性。 可 golang 吹里面,写过 C/C++ Delphi Pascal 之类原生语言的特别少, 连 linker error 都没遇见过的,大多数是从 python nodejs 过来的,却要做 better C ,那就比较令人无语了。
    jarlyyn
        51
    jarlyyn  
       2017-02-08 15:02:51 +08:00
    @noli

    你第一个回复是 16 楼

    能否告诉我,前 15 楼哪个是 golang 吹?

    这个楼里 你 @ 过的为

    CRVV,我

    怎么看都只有我拿 java 黑了 C#两句。

    你能不能说说我们那一楼的在吹 golang 了?

    你到底是无语 go 吹,还是无语 c#黑呢?
    wizardforcel
        52
    wizardforcel  
       2017-02-08 15:19:11 +08:00
    golang 缺少编译期和运行期都检查的泛型。

    不检查的话稍微 hack 一下就好了。
    gowk
        53
    gowk  
       2017-02-08 15:26:08 +08:00
    这种贴到最后往往变成语言之争
    janxin
        54
    janxin  
       2017-02-08 16:30:20 +08:00   ❤️ 1
    @gamexg 内部错误类型应该还是要区分的,其实也是有一些办法,不过不论怎么样都是比较麻烦。 https://blog.golang.org/errors-are-values 其实类型断言也可以,就是写起来比较麻烦。标准库内部的部分细节也不是全部暴露。
    caiych
        55
    caiych  
       2017-02-08 16:41:51 +08:00
    @kappa rsc 是 TL
    manager 好像是 sameer
    bigpigeon
        56
    bigpigeon  
       2017-02-08 17:28:30 +08:00
    我想请楼主指出一个泛型能够做到,其他方案没法做到,并且做的好的例子出来
    CRVV
        57
    CRVV  
       2017-02-08 18:53:38 +08:00   ❤️ 1
    @bigpigeon

    1. 比如 C++ 的容器和算法,用没有泛型的语言来实现会很麻烦。对比一下 std::sort 和 qsort 两个函数, std::sort 用起来简单得多

    2. 还是上面的 std::sort 和 qsort , std::sort 的性能更好,是因为这个情况下一些函数内联的优化依赖于泛型
    QAPTEAWH
        58
    QAPTEAWH  
       2017-02-08 19:03:26 +08:00
    要泛型干啥,加个宏嘛(逃
    zhleonix
        59
    zhleonix  
       2017-02-08 19:40:31 +08:00
    用 GO ,始终要翻墙。
    kappa
        60
    kappa  
       2017-02-08 19:44:57 +08:00
    @zhleonix 那就易语言吧

    @caiych 找到了 2015 年的采访
    > Today, Rob and I lead the overall Go project at Google together.
    bianhua
        61
    bianhua  
       2017-02-08 20:14:29 +08:00
    @jarlyyn

    > 我认为语言之间当然没有优劣之分,只有适合不适合。

    NO NO NO ,语言自然有优劣之分。说没有只是 PC 而已,为了避免争吵。

    语言有优劣之分,也有是否合适。

    只是大多数流行的语言在竞争的压力下,选择了自己的专长(适用领域)。有很多语言因为“劣质”的原因,根本没有机会流行起来,或者只是流行了一小段时间。
    jarlyyn
        62
    jarlyyn  
       2017-02-08 21:14:39 +08:00
    @bianhua

    原来这样啊,那不知道语言的优劣的标准是什么?

    lua 和 c#那个优,哪个劣?
    noli
        63
    noli  
       2017-02-08 23:40:51 +08:00
    @jarlyyn

    评判语言优劣需要设定标准。有些标准是主观的,譬如说适不适合啊,是否方便阅读啊;但有些标准是可以用数理逻辑去验证的,譬如各种语言 feature 的正交性、语法二义性、语义表达能力,

    在正交性方面, Lua 比 C# 的正交性好——意味着语言的各种元素、元对象的组合控制能力比 C# 来得精确。例如 lua 的 table 完全可以模拟 OO 的继承、多态;

    但是 C# 的语义表达能力又比 lua 好——实现同样的抽象逻辑,使用 C# 可以写更少的代码。而 C# 如果不套用 OO 的逻辑,完全可以借助泛型和反射实现 Lua 的精确控制能力。

    综上, C# 是一门比 Lua 好的语言。

    当然啦,不关心细节的码农,大概是什么拿到手只要为其所用就好——就像有些人的择偶要求,女的活的,就可以了。
    当人只需要满足低级需求的时候,谈什么是好的就是奢侈。
    当使用编程语言只需要交货满足工程需要的时候,谈特性都是废话。

    你也是这么看的吧?
    jarlyyn
        64
    jarlyyn  
       2017-02-09 00:47:28 +08:00
    @noli

    当然不是。

    我压根不关心特性,我只关心场景。

    正好这两门语言都是我用过一段的语言。

    这两语言对我而言没什么优劣。

    如果写 windows 桌面程序,我肯定用 c#。

    如果写用来写嵌入式的脚本,我肯定用 lua 。

    c#和 lua 的生态本质上也是围绕这两个语言适合场景发展的。不存在好不好。哪怕可能有其他的第三方库 /转译器。我也不会选择。

    当然,这两个场景,我都不会选 go 。

    就我而言,目前的选择大概是

    网页 /模板语言选择 php,这个方向放弃过 python

    重接口的服务选择 go,这个方向放弃过 nodejs

    嵌入式脚本选择 lua ,这个方向放弃过 js

    维护脚本选择 python+shell

    简单的 ui 界面选择 electron+nodejs/go,这个方向自从我换过主系统后放弃过 c#,VB 等一票

    我只看某个场景适合不适合,不太考虑语言特性,甚至会放弃某些语言中比较特殊的特性。

    所以 python 和 perl 我会喜欢 python

    所以 nodejs 和 go 我会喜欢 go

    一定要我说什么语言好的话,我会倾向与更简单通用,学习成本更低的语言。

    就这么简单。
    noli
        65
    noli  
       2017-02-09 01:42:25 +08:00
    @jarlyyn 这只能说明,你的软件生涯里面大多数时间是不断地创造和交付程序而很少长期维护, code base 对你来说是不存在的概念。就酱,夏虫不可语冰。
    ototsuyume
        66
    ototsuyume  
       2017-02-09 06:39:59 +08:00
    都什么年代了还拿语法特效来黑 Go 。 Go 的设计意图已经够明确了,不在乎语法优不优美特性丰不丰富,只在乎效率,不光是运行的效率还有团队的开发效率,完全就是一种对工程妥帖的选择。不然那么多创业公司用 Go 是眼瞎了嘛
    zzWinD
        67
    zzWinD  
       2017-02-09 08:13:12 +08:00
    一门语言能被喷是好事情。
    PHP 被喷了这么久 还是屹立不倒 JAVA 也是
    vagary
        68
    vagary  
       2017-02-09 08:37:20 +08:00
    @noli
    大神,想听你说说 C# 有哪些缺点
    ikaros
        69
    ikaros  
       2017-02-09 09:12:59 +08:00
    @ototsuyume 我觉得除了在错误处理方面 golang 做得不够优雅,其他地方我觉得都不错,而且退一步说,即使语言本身设计不够优雅也可以通过代码结构调整使之优雅.
    jokerjoker
        70
    jokerjoker  
       2017-02-09 09:57:04 +08:00
    @noli 我表示赞同你,C#应该是目前世界上最好的语言了
    zhouquanbest
        71
    zhouquanbest  
       2017-02-09 10:02:29 +08:00
    我选 Kotlin
    当 Java 的同人就可以了
    gc532
        72
    gc532  
       2017-02-09 10:02:36 +08:00 via Android
    Let's Rust.
    pooker
        73
    pooker  
       2017-02-09 10:20:46 +08:00
    脱离业务场景大谈特谈语言优缺点都是耍流氓
    vicalloy
        74
    vicalloy  
       2017-02-09 10:42:48 +08:00
    不是特定语言的死忠,不想加入混战,不过还是想说一句,语言本身也是有优劣的。
    比如我就认为
    Swift 就比 Objective-C 要优秀很多。
    Python 比 Perl 要优秀很多。
    Rust 应当会比 C++优秀很多(这个没有真正用过,所以是应当)。

    拒绝承认开发语言的优劣就是拒绝承认技术的进步。
    jarlyyn
        75
    jarlyyn  
       2017-02-09 10:44:54 +08:00
    @vicalloy

    虽然我很喜欢 python,很不喜欢 perl,但 python 比 perl 优秀是什么鬼?

    这分明是不同的价值取向。
    repus911
        76
    repus911  
       2017-02-09 11:29:12 +08:00   ❤️ 2
    混迹这么久 一直以为 jarlyyn 挺激进的 看了会儿发现 noli 更激进 形同喷子
    "没有想到任何别的场合是能用的"
    "自认为是码农""降纬攻击"
    "golang 吹 v2 上特别多"
    "不关心细节的码农"
    "夏虫不可语冰"
    道德至高、下定义、贴标签 然而也没看出来能力如何
    (装了逼就跑 真 TM 刺激
    wph95
        77
    wph95  
       2017-02-09 11:37:24 +08:00 via iPhone   ❤️ 1
    看了楼上的讨论,得出结论
    1. Google 是傻子 ,选 Golang 写 k8s 。而不是选 C#
    2. C# 强无敌,快一统江山。
    3. lua 也会被 C# 干翻
    bianhua
        78
    bianhua  
       2017-02-09 12:08:49 +08:00
    @jarlyyn

    你倒是很会挑对自己有利的例子。但当我拿出 QBASIC 和 GVBASIC ,你还能说出什么来么?

    当然可能你只听说过 TIOBE TOP 10 上的那些语言,写过的更少,所以才得出那些结论。但我已经说过了,流行的语言已经找到了自己的适用域,所以它们才没有被抛弃。

    其实你拿 TIOBE TOP 50 和 TIOBE TOP 10 比比就能得出结论了——一些语言就是没有令一些优秀。

    关于语言之争,其实引起争论的原因不是语言,而是在这些语言的背后,使用这些语言的人——当你开始批评一种语言的时候,不可避免的会激怒一些使用这些语言的用户——如果这些语言有用户的话。这就是为什么会有那种 PC 式的陈述句,避免让自己暴露在非理性的漩涡中。

    但是,一件东西会比另一个东西好,这是自然的,就像一个人会比另一个人优秀、一个设计比另一个设计好看一样。所以当你说“这些东西没有好坏之分”的时候,要么是在说谎,要么是在犯错。
    jarlyyn
        79
    jarlyyn  
       2017-02-09 12:22:54 +08:00
    首先指出几个问题。

    1.QBASIC 和 GVBASIC 都是 basic 语言,不知道你想说什么?

    2.lua 啥时候上过 tiobe top 10 了?

    一个东西会比另外一个东西是自然不可能的,东西是客观存在,好与不好是每个人的主管判断,这是一个基本的哲学常识。

    说 A 这个人比 B 这个人好,没有场景的话,鬼知道是什么意思?

    心地好?

    能力强?

    人工成本低?

    善于沟通?

    所谓的好看,也只是好 /优秀的某一个标注而已。

    你还需要好好了解这个世界
    jarlyyn
        80
    jarlyyn  
       2017-02-09 12:30:22 +08:00
    @bianhua

    再细化一下关于你两种 basic 的问题。

    说真的,在这个论坛被人义正言辞的问这个问题,真的很冷幽默。

    我是 BASIC 入门的,从当年小霸王自带的 basic 开始,到 Q Basic,到 VB ,都写过一定的程序。

    第一次看到把具体的语言实现当成语言本身的。 golang 还有个 gccgo 呢

    按你的分法, C 是不是还分 borland c,tubor c,vc,gcc,clang?

    java 是不是也要按不同的 jvm 来分为不同的语言?

    c#也分.net 和 Mono?

    真的很佩服你一本正经说瞎话的强大内心。
    htfy96
        81
    htfy96  
       2017-02-09 12:40:57 +08:00
    我只想知道 json 序列化没编译期泛型也不用 go generate 速度怎么上去
    bianhua
        82
    bianhua  
       2017-02-09 12:47:11 +08:00
    哈哈哈哈。首先题主的主题是泛型,这帖子已经不知道去哪儿了。最近在写 Golang ,我觉得泛型这种东西,有更好,没有也没什么关系。

    @jarlyyn

    > 一个东西会比另外一个东西是自然不可能的,东西是客观存在,好与不好是每个人的主管判断,这是一个基本的哲学常识。

    不知道我理解错了没。但,你是不是在说,一个东西在客观上是不会比另一个东西好或差的,是这样么?
    jarlyyn
        83
    jarlyyn  
       2017-02-09 12:49:38 +08:00
    @bianhua

    是的。

    因为好或者坏不是一个客观范畴内的东西。

    这个世界本没有好与坏。

    只有你认为他好,或者认为他坏。

    而不同的人认定好坏的标准是不同的。
    Balthild
        84
    Balthild  
       2017-02-09 12:56:11 +08:00
    @noli
    > golang 除了写 业务 server 之外,没有想到任何别的场合是能用的。
    docker 是虚拟化场合在 Go 上的实现,只要它「能用」即可反驳上述这句话。而你又扯出什么可不可替代的概念来转移话题。
    sunsx
        85
    sunsx  
       2017-02-09 13:03:36 +08:00
    @jarlyyn 脾气真好,那个 noli 每回复一次就损你一次,连你媳妇都损上了,居然不发火


    当然啦,不关心细节的码农,大概是什么拿到手只要为其所用就好——就像有些人的择偶要求,女的活的,就可以了。
    当人只需要满足低级需求的时候,谈什么是好的就是奢侈。
    当使用编程语言只需要交货满足工程需要的时候,谈特性都是废话。

    你也是这么看的吧?
    zgqq
        86
    zgqq  
       2017-02-09 13:13:18 +08:00 via Android
    java 恐成最后赢家
    janxin
        87
    janxin  
       2017-02-09 13:34:11 +08:00
    @htfy96 json 解析有方案,但是序列化似乎没有什么好办法...
    TangMonk
        88
    TangMonk  
       2017-02-09 13:47:28 +08:00
    火气真大
    noli
        89
    noli  
       2017-02-09 14:01:15 +08:00 via iPhone
    @Balthild 如果你是 docker 的开发者,那么你可以说这句话,然而多数人不是也很少机会用 golang 去扩展 docker 的能力。如果非要说 golang 写了 docker 能证明 golang 不仅仅在业务服务器上能用,那么我也可以说 js 可以写 os ,孤立的例子而已嘛,
    jarlyyn
        90
    jarlyyn  
       2017-02-09 15:28:04 +08:00
    @noli

    只要有 os 是 js 写的,为什么你不能说 js 可以写 os?

    就如同现在 js 已经可以写应用程序客户端,各平台手机 app 一样。

    你自己的话说错了,怎么可以拖 js 下水?
    noli
        91
    noli  
       2017-02-09 15:47:59 +08:00
    @jarlyyn 所以我没有说过 golang 不能写别的啊,我说的就是场合。
    js 写 OS 当然可以,我也没说不可以。
    但我不认为 js 能写出有价值的 OS ,因为大家都不觉得 OS 领域是 JS 适合的场合。
    同理,我不觉得 golang 能够有更多的地方发挥,因为:

    1. 缺乏泛型支持,这也就罢了,居然支持隐式 interface 这种在别的强类型语言里面都可能当作 warning 甚至 error 的特性

    2. 缺乏 OS 级别的组件化支持(例如 dll , so 这样的),甚至 golang 自己的包管理也是一坨翔

    这两点都是限制一门语言大规模使用的关键缺陷。
    小业务用一下,是不错的,但 golang 不会是 better C ,最多跟 python nodejs 竞争一下。
    noli
        92
    noli  
       2017-02-09 16:02:29 +08:00
    @bianhua

    @jarlyyn 认为“一个东西在客观上是不会比另一个东西好或差的” 。如果他说但“东西”指的是客观存在的、非人工事物,那这话很可能是对的。然而世界上至少有两种东西,是客观上会比另外一个东西好或者差的,一是数学,二就是编程语言。这两者都是表达人类思维抽象的工具,这是绝对有好坏之分、先进高级和落后低级之分的。

    当然啦,如果有人举例说,“乘法怎么就比加法优秀了” 这样的话,你不用跟他说什么,没学过高等数学的人,说这个话题太为难他们。
    thekll
        93
    thekll  
       2017-02-09 16:46:13 +08:00 via iPhone
    “通用语言”这个概念本身就隐含了“解决各种计算问题的”含义;
    “各种计算问题”隐含了“现实中不可能只有一个问题”,即使只有一个问题,那也必须分成多个问题才能解决;
    语言的优劣就是相对于某些特定的问题表现出的相对适合性;

    撇开问题域去讨论语言的优劣很没意思。很容易陷入一种混乱的攻击,这就像从一个错误的假设可以推出各种匪夷所思的结果,从没有预设的条件去推也会是这种的结果。

    最近也在回头看微处理器架构、 ISA 、机器码、汇编语言、算法、编译原理,也仔细想过语言的等价性问题、形式语言、形式系统等。

    有感而发,希望自己对于从图灵、冯诺伊曼以来,计算理论模型、计算系统构造者们心中所要实现的那个东西理解的没错。
    jarlyyn
        94
    jarlyyn  
       2017-02-09 17:08:19 +08:00
    @noli

    所以这是你觉得,这不是个定论,这是最重要的一个前提。

    你觉得 js 不能写 os
    你觉得 某个语言可能比别的语言好。

    这只是在你觉得的这个范畴之呢的。

    “这两点都是限制一门语言大规模使用的关键缺陷。 ”

    很多语言本来就不是设计出来用于大规模使用的。

    典型如 lua

    典型如 php

    在我看来,能否被大规模使用的,和语言特性没多大关系。

    比如 js 的使用规模够大了吧,是因为语言特性吗?

    比如 objectC 算使用规模够大了吧,是因为语言特性吗?

    语言被大规模使用的主要语言,很可能是最重要的语言,是适合的场景是不是有了爆发行的增长


    至于说什么编程语言是表达人类思维抽象的工具

    对不起,对于这个世界绝大部分的人来说,编程语言只是解决问题的工具。

    我想不通我的思维,哪怕抽象后,能如何被任何一门编程语言哪怕表达一部分。
    noli
        95
    noli  
       2017-02-09 17:29:18 +08:00
    @thekll 但其实你有没有想过,现代软件工程面对的“问题领域”其实本身很多是生安白造的概念,为了推广一些商业解决方案特意把水搞浑的。如果基于这类“领域问题”来讨论编程语言的优劣,本身就是在虚弱的理论基础上来谈的。

    我举个例子(读音:再黑 golang 一把)。 golang 标榜的是解决什么问题呢,以下内容摘自( https://golang.org/doc/faq#What_is_the_purpose_of_the_projecthttps://talks.golang.org/2012/splash.article

    1. 解决类似于 C/C++ 这样的语言大规模编译时编译慢的问题
    从观察来看 golang 是编译得够快的,然而 golang 能不能像 C/C++ 那样组织大规模的项目,我上一条回复说了, golang 里面的一些固有缺点本身阻碍了 golang 项目的可组织性。下文详解。并且, C/C++ 大项目慢,本身固然有 C/C++ 的头文件机制的原因,但是很多其他语言编译得很快,却不必需要像 golang 那样为了编译快对语言特性做阉割。甚至,即使以 C/C++ 的头文件、源代码分离的方式组织代码,并不一定就会导致编译慢。 只不过重新写一个 C++ 的编译器实在是太难了,没有必要。(同理,重新写一个 docker 也没有必要,这并不意味着用 golang 写 docker 就是好, 对 @CRVV 蜜汁微笑 )

    2. 对软件模块的依赖的分析更容易,解决 模块正确集成的问题
    哈哈, golang 自己很明显就做不到。对比同为编译到二进制代码的 mono 和 .NET CLR 是怎么解决模块版本差异的, NuGet 是怎么设计的,我喷 golang 的模块机制就是一坨屎真心不过分。

    3. golang 提供 GC 和并发任务之间的通讯的基本支持。
    golang 的 GC 有进步,那我就祝贺它不喷它了,反正你喷了也没有,你又不能影响或者 hack golang 的 GC 。 channel 就是所说的对并发任务间的通讯的基本支持了吧?这从来就不是什么难题,各大语言都有类似的解决方案,而且还不止满足一种模型,当然啦,有很多人驾驭不了,找到 golang 就觉得有救星了。然而这种狂热仅仅是出于无知和无能的自信。

    4. By its design, Go proposes an approach for the construction of system software on multicore machines.

    这个 propose 是成功的。然而很遗憾的是,也导致了一堆人只懂得这种方案。我想说,解决异步回调地狱的解决方案有很多种,通过 event queue 机制只是其中的一种;其他的方式包括:语言生成状态机( async await ); Actor 模型;

    event queue 也是有缺点的,比起状态机方法,基于 event queue 异步事件的上下文依然存在事件处理内外机制的割裂问题,代码耦合性属于中等。然而 golang 在语言级别支持的 channel 很大程度阻止你们使用其他模型。
    chingli
        96
    chingli  
       2017-02-09 17:29:24 +08:00
    @noli 1. 说说 Go 的接口实现有什么不好?

    2. Go 的包管理确实还不完善,但也有可取之处,不至于说成一坨翔。
    jarlyyn
        97
    jarlyyn  
       2017-02-09 17:34:45 +08:00
    @chingli

    因为接口不是面向对象

    你很难让一个面向对象粉去喜欢接口的。
    noli
        98
    noli  
       2017-02-09 17:44:27 +08:00
    @jarlyyn 喷你一点爽快感都没有,因为你自认为不需要讨论更高层次的东西,我咋秀优越感呢。你自个儿玩得开心就好。我只对你吹的 golang 感兴趣,因为 golang 真的很适合用来暴露智商,哈哈哈哈。

    @chingli golang 的包管理做不到模块版本差异分析——就这一点说明了其实它根本没有解决过(甚至可能其发明者故意歪曲了这个问题的本质),它只是拿这个来作为噱头。 golang 的 interface 设计本身就是造成这个“已经解决的问题”变得更麻烦的原因之一。

    golang interface 本意是一个 运行时安全的 duck typing ,然而又允许空 interface ,这样就把所有的 泛型可能性、多分派的可能性完全扼杀,甚至引入了漏洞(而在大规模项目里面,万能指针就是 万恶根源)

    这种设计让我看到了 golang 设计者其实并没有解决问题的诚意,只是用歪打正着的方式来回避问题。所以我特别讨厌 golang 以及 golang 吹;要么是出于无知,要么是出于无耻。
    jarlyyn
        99
    jarlyyn  
       2017-02-09 17:49:26 +08:00
    @noli

    说的编程语言是个层次很高的东西一样,呵呵。要秀优越很简单啊,穷车富表么,秀一下让人羡慕的生活是最好的秀优越感的吗。

    我到现在也不明白,难道会或者擅长几种语言也是一个能秀优越的地方吗?你的人生不可能这么缺乏亮点吧?
    noli
        100
    noli  
       2017-02-09 17:58:25 +08:00
    gopher 是怎么也理解不了 return Either<Result, Error> 这种方式 比 return res, err 好在哪的啦,你很难让一条喜欢钻狗洞的狗,人模人样的走大门。

    什么?这是面向对象? @jarlyyn 你说是面向对象吗?
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1300 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 23:32 · PVG 07:32 · LAX 15:32 · JFK 18:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.