Go 与 泛型: 优点 or 缺陷

2017-02-08 09:26:18 +08:00
 banxi1988

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

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

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

注: Russ Cox 目前是 Go Team 的 leader

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

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

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

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

9016 次点击
所在节点    Go 编程语言
128 条回复
noli
2017-02-08 13:45:37 +08:00
@gamexg

我司线上服务器用 mono 已经很久了。
如果你说 C# GUI 开发就是指 WPF 之类的话,这当然是没有的。
但是 xamarin studio 本身就是一个很好的 C# 跨平台 GUI 开发的例子。
scnace
2017-02-08 13:48:23 +08:00
noli
2017-02-08 13:57:17 +08:00
@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
2017-02-08 13:58:37 +08:00
↑↑怎么每次有 Go 的话题 都会跟其他语言打起来?(你们其他语言这样吗?
CRVV
2017-02-08 14:01:28 +08:00
@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
2017-02-08 14:03:06 +08:00
@noli C# 很好,但我发现一些公司因为招不到足够多靠谱的 C# 程序员而正在选择转 Go ,这一点值得注意。大部分使用 Go 的公司,程序员都是从 c++ 之类的转过去的,相对来说容易很多。
jarlyyn
2017-02-08 14:10:25 +08:00
@noli

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

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

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

至于吹不吹的。

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

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

你第一个回复是 16 楼

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

这个楼里 你 @ 过的为

CRVV,我

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

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

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

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

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

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

@caiych 找到了 2015 年的采访
> Today, Rob and I lead the overall Go project at Google together.

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

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

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

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

© 2021 V2EX