浅谈go&java差异

循环

go

go提供了range关键字可以循环各种切片和数组,同时也提供了多参,这点相比较java会灵活不少,

另外switch循环也不同与java,默认仅进入匹配的case内不会往下循环,若需要往下循环需要用到

fallthrough关键字,这个也确实有利于开发,不用像java一样写break结束。

funcmain(){      arr := []string{"a","b","c"}forval :=rangearr {          fmt.Println(arr[val])      }fori :=0; i <10; i++ {          fmt.Println(i)      }      caseVal :="C"switchcaseVal {case"A":          fmt.Println("This is A")case"B":          fmt.Println("This is B")case"C":          fmt.Println("This is C")default:          fmt.Println("This is other word!")      }  }

java

java 提供了多种循环,分别是for、foreach、Stream foreach(java8提供),while、do while

switch ,我就直接展示代码吧。

@Testpublicvoid forTest(){String[] arr =newString[]{"A","B","C"};for(Stringitem:arr) {LOG.info(item);      }for(inti=0;i

多值返回

go

go提供了多参返回,当参数较少当时候可以一次性返回,不用构造结构体返回

funcmain(){      a, b, c, err := process(11,"A",true)      fmt.Println(a, b, c, err)  }funcprocess(aaint32, bbstring, ccbool)(int32,string,bool, error){varccReturnbooliftrue== cc {          ccReturn =false}else{          ccReturn =true}returnaa +1, bb +"_return", ccReturn,nil}

java

java并没有提供多参返回,若要实现多参返回,一般将返回参数封装入Map、List 这类集合类型中,

或者构造一个新对象放入返回值后返回。

@TestpublicvoidreturnObjec(){Map result =this.processObj();          LOG.info(newJSONObject(result).toString());      }      publicMap processObj(){returnnewHashMap(){{              put("val1",true);              put("val2","str");              put("val3",999777L);          }};      }

defer & finally

go

首先 defer 和 finally 大多用于资源关闭或异常处理

go中的defer 与 java的finally个人感觉是相似的,但是如果将defer放入到循环内的话可就像

一个反向队列了,若一个处理逻辑内有多个defer的时候 先defer的晚于后defer,很有意思,大家可以试试哈~

funcmain(){      doSomething()  }funcdoSomething(){      fmt.Println("something start")deferfmt.Println("something defer")      fmt.Println("something end")      arr := []string{"a","b","c"}forval :=rangearr {deferfmt.Println(val)      }  }

java

java 的finally 大多用于异常处理,尤其是文件流异常处理,同时也不存在类似于defer的倒序处理,

这里就给个简单的例子~

@TestpublicvoidprocessFinal(){String[] arr =newString[]{"A","B"};try{          LOG.info(arr[2]);      }catch(Exception e){          LOG.info("异常了:{}",e);      }finally{          LOG.info("最后进入~");      }  }

init 与默认构造函数

go

go不存在默认构造函数,但是提供了init函数;我一开始也想不起来go的init函数如何与java的初始化

对比,灵机一动就有了无参的构造函数,虽然这样对比其实并不恰当,但是功能上是有相似的地方。另外需要

说明的是go的init的函数是在包被引入的时候调用的 若与main函数存在同一代码块 也是init先被调用,

而java的默认构造函数仅在对象被new的时候调用的。

funcmain(){      fmt.Println("func main()")  }funcinit(){      fmt.Println("func init()")  }

java

java的默认构造方法其实并不常用,但是在每启一个类的时候都有默认的构造方法,若是定义了就会走默认的构造

方法,若无则在编译为class文件的时候自动为所在类加入一个。

publicclassConstructTest{privatestaticfinalLogger LOG = LoggerFactory.getLogger(ConstructTest.class);@TestpublicvoidprocessConst(){          LOG.info(">>> start");          Person person =newPerson();          LOG.info(">>> end");      }  }classPerson{privatestaticfinalLogger logger = LoggerFactory.getLogger(Person.class);privateString name;privateInteger age;publicPerson(){          logger.info("default Constructor");      }publicStringgetName(){returnname;      }publicvoidsetName(String name){this.name = name;      }publicIntegergetAge(){returnage;      }publicvoidsetAge(Integer age){this.age = age;      }  }

const 与 static final

go

go的静态(也可叫静态常量,主要用于基本数据类型),使用关键字const指定。

使用const定义的静态变量是不可用修改或赋值的。

constnameint=11const(      a ="hello"b =truec =99)funcmain(){      fmt.Println(name)      fmt.Println(a)      fmt.Println(b)      fmt.Println(c)  }

java

java的常量需要用两个关键字修饰 static 和 final ,前者表示静态的意思,但这个静态是可以被修改的,

修改的前提是类型不变,而第二个关键字表示最终的意思,一旦变量被这个关键字修饰则不可重新修改变量。

但是对于复合对象,比如List、Map、自定义对象等,又是可以被修改的,对于这点个人觉得 java 的常量的定义

并不够严谨。

publicclassstaticFinalTest{privatestaticfinalLogger LOG = LoggerFactory.getLogger(staticFinalTest.class);privatestaticfinalString name ="Tom";privatestaticString item ="first item";privatestaticfinalList initArr =newArrayList(){{        add("A");        add("B");        add("C");    }};@Testpublicvoidprocess(){        LOG.info(name);        item ="youth!";        LOG.info(item);        initArr.add("hello");        LOG.info(initArr.toString());    }}

参数或方法访问属性

go

go 的方法或参数需要被外部访问,需要使用大写开头参数名或函数名(go文件大小写是与与否与是否私有无关)

// 可被文件外函数访问varNamestring="John"funcmain(){      fmt.Println(Name)      Process()  }// 可被文件外函数调用funcProcess(){      fmt.Println("Process()")  }

java

java的参数或方法属性不同于go,大致分为三类:

private 仅当前类内访问

public 可公共访问

protect 仅可同包内访问

publicclassObjectTypeTest{privatestaticfinalLogger LOG = LoggerFactory.getLogger(ObjectTypeTest.class);//私有访问(仅可同一类中)privateString name1 ="name01";// 保护访问(仅可同一包内)protectedString name2 ="name01";// 公共访问 (任何类均可访问)publicString name3 ="name01";@Testpublicvoidprocess(){          LOG.info(this.doSomeThing());          LOG.info(name1);          LOG.info(name2);          LOG.info(name3);      }publicStringdoSomeThing(){return"hello";      }  }

进群:697699179可以获取Java、大数据各类入门学习资料!

这是我的微信公众号【编程study】各位大佬有空可以关注下,每天更新Java、大数据学习方法,感谢! 学习中遇到问题有不明白的地方,推荐加小编Java|大数据学习群:697699179内有视频教程 ,直播课程 ,等学习资料,期待你的加入

你可能感兴趣的:(浅谈go&java差异)