我先声明啊,我不是来吹捧 java 的,我只是想说一个事实,编程语言 没有谁绝对的碾压谁,真遇到了实际业务需求,写出来的代码量绝对是半斤八两。
我希望大家 在 吐槽一门语言的时候,可以理性一点,不要瞎喷。这篇文章的用意就在于此。
还有一点,我用 go 来比较,是因为 go 擅长的场景,跟 java 有一定的重叠,有很多公司都用 go 开发 web 。绝对没有对 go 不敬的意思。
总结下来,从工作量的角度来看,就是多了一个倒置的域名而已,而且只需要花建一层目录的时间,并且这个倒置的域名 是有他的意义在里面的,你们可以把他看做是这个
// go 语言里的 import ,前面也有一个域名+项目名 来确定唯一性,包名里的倒置域名就是起这个作用的
import "github.com/scan-util/xxx/xxx"
还有很重要的一点,你们喷来喷去的那些多余的目录结构,在我们的观念里 根本就不存在,因为从来没有手工去创建过,要不是你们来吐槽,我们还真想不到这一点。
不是因为 习惯了,而是真的从来没有为他们花过 5 秒钟以上的时间。有的连一毫秒都没花过。
go
func BytesToString(val []byte) string
java
public String BytesToString(byte[] val)
我真没看出来多了什么东西
go
name := "张三";
var map = make(map[string]interface{})
var array = make(string[], 10);
java
String name = "张三";
Map<String, Object> map = new HashMap<>();
String[] array = new String[10];
好像多了点东西,又好像没多什么。
go
for(i:=0;i<100;i++){
}
for(i<100){
}
java
for(int i=0;i<100;i++){
}
while(i<100){
}
确实多了几个字母。
go
我知道这叫结构体,跟类是两码事,但是 go 就是用它来兼容 oop 的,所以我只能用它来举例子,因为没有其他语法可以实现 oop 了
type DemoParam struct {
name string
}
func (demoParam *DemoParam) FormValues(key string) []string {
}
java
class DemoParam {
public String name;
public String[] FormValues(String key){
}
}
字数上相差多少,我是懒得数了,但是你们真的不觉得 java 的结构更清晰吗? 其他的继承,多态 我就不拿出来说了,go 基本上是 用的 c 的编程思想,oop 只是个兼容, 所以用 java 来跟他比 oop 没什么可比性。因为是两个方向。
go
func testFunction(paramStr string) (string, error) {
if xxx {
return Errors.New("xxxx");
}
}
paramStr, err := testFunction("ok")
if err != nil {
log.Println(err.Error())
}
java
public String testFunction(String paramStr){
if (xxx) {
throw new Execption("xxx");
}
}
try {
String paramStr = testFunction("ok");
} catch(Execption e){
log.Println(e.getMessage);
}
这个看起来 go 好像 舒服一点,但是,实际场景下 go 经常是这种姿势
paramStr, err := testFunction("ok")
if err != nil {
log.Println(err.Error())
}
paramStr, err := testFunction2("ok")
if err != nil {
log.Println(err.Error())
}
paramStr, err := testFunction3("ok")
if err != nil {
log.Println(err.Error())
}
而 java 还是只需要这样
try {
String paramStr = testFunction("ok");
String paramStr = testFunction2("ok");
String paramStr = testFunction3("ok");
} catch(Execption e){
log.Println(e.getMessage);
}
并且这是 经过人为判断后,返回的错误提示,如果是意外的异常呢? go 里面叫 panic ,java 只要用 try catch 包住了 就可以捕获,但是 go 需要用 defer ,而且一旦抛出异常就意味着这个函数结束了,你如果想在出异常后,处理一下 然后继续往下走,go 会非常的麻烦。
go
// 如果有一个 interface{} 类型的变量 a ,想转成 int
// 你必须明确的知道,他装箱前就是 int ,不然根本没法拆,必须做一下类型判断。
// 我之前在写框架的时候 就被折磨的够呛,一大堆不必要的 if
java
// 不管装箱前是什么,只要他的值是一个整数
// 无论是 1 , 还是 "1", 都可以这么转
Integer aInt = Integer.parseInteger(a.toString());
// 也可以直接拆成 String
a.toString();
你们出一个需求给我,我用 java ,你们用 go ,nodejs ,python ,php 随便什么语言,最后来比比 谁的代码少一些。 我敢说,绝对半斤八两,不可能有谁碾压谁的。
而且还有一定的概率,java 在 丰富的生态+强大官方库的 加持下,可以更快完成。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.