20190312_浅谈go&java差异(二)

转载请注明出处:https://www.cnblogs.com/funnyzpc/p/10801474.html
第二节内容概览
- 循环(for、switch)
- 多值返回
- defer & finally
- init(go) 与默认构造函数(java)
- 常量、静态变量(const 与 static final)
- 参数或方法访问属性
循环
- go 
 go提供了range关键字可以循环各种切片和数组,同时也提供了多参,这点相比较java会灵活不少,
 另外switch循环也不同与java,默认仅进入匹配的case内不会往下循环,若需要往下循环需要用到
 fallthrough关键字,这个也确实有利于开发,不用像java一样写break结束。- func main() {
 arr := []string{"a", "b", "c"} for val := range arr {
 fmt.Println(arr[val])
 } for i := 0; i < 10; i++ {
 fmt.Println(i)
 } caseVal := "C"
 switch caseVal {
 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 ,我就直接展示代码吧。- @Test
 public void forTest(){
 String[] arr = new String[]{"A","B","C"};
 for (String item:arr) {
 LOG.info(item);
 } for(int i=0;i<arr.length;i++){
 LOG.info(arr[i]);
 } String word = "B"; switch (word){
 case "A":
 LOG.info("This is A");
 break;
 case "B":
 LOG.info("This is B");
 break;
 case "C":
 LOG.info("This is C");
 break;
 default:
 LOG.info("This is Other word!");
 }
 }
 
多值返回
- go 
 go提供了多参返回,当参数较少当时候可以一次性返回,不用构造结构体返回- func main() {
 a, b, c, err := process(11, "A", true)
 fmt.Println(a, b, c, err)
 } func process(aa int32, bb string, cc bool) (int32, string, bool, error) {
 var ccReturn bool
 if true == cc {
 ccReturn = false
 } else {
 ccReturn = true
 }
 return aa + 1, bb + "_return", ccReturn, nil
 }
- java 
 java并没有提供多参返回,若要实现多参返回,一般将返回参数封装入Map、List 这类集合类型中,
 或者构造一个新对象放入返回值后返回。- @Test
 public void returnObjec(){
 Map<String,Object> result = this.processObj();
 LOG.info(new JSONObject(result).toString());
 } public Map<String,Object> processObj(){
 return new HashMap<String,Object>(){{
 put("val1",true);
 put("val2","str");
 put("val3",999777L);
 }};
 }
 
defer & finally
- go 
 首先 defer 和 finally 大多用于资源关闭或异常处理
 go中的defer 与 java的finally个人感觉是相似的,但是如果将defer放入到循环内的话可就像
 一个反向队列了,若一个处理逻辑内有多个defer的时候 先defer的晚于后defer,很有意思,大家可以试试哈~- func main() {
 doSomething()
 } func doSomething() {
 fmt.Println("something start")
 defer fmt.Println("something defer")
 fmt.Println("something end") arr := []string{"a", "b", "c"}
 for val := range arr {
 defer fmt.Println(val)
 }
 }
- java 
 java 的finally 大多用于异常处理,尤其是文件流异常处理,同时也不存在类似于defer的倒序处理,
 这里就给个简单的例子~- @Test
 public void processFinal(){
 String[] arr = new String[]{"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的时候调用的。- func main() {
 fmt.Println("func main()")
 } func init() {
 fmt.Println("func init()")
 }
- java 
 java的默认构造方法其实并不常用,但是在每启一个类的时候都有默认的构造方法,若是定义了就会走默认的构造
 方法,若无则在编译为class文件的时候自动为所在类加入一个。- public class ConstructTest {
 private static final Logger LOG = LoggerFactory.getLogger(ConstructTest.class);
 @Test
 public void processConst(){
 LOG.info(">>> start");
 Person person = new Person();
 LOG.info(">>> end");
 }
 } class Person{
 private static final Logger logger = LoggerFactory.getLogger(Person.class);
 private String name;
 private Integer age; public Person() {
 logger.info("default Constructor");
 } public String getName() {
 return name;
 } public void setName(String name) {
 this.name = name;
 } public Integer getAge() {
 return age;
 } public void setAge(Integer age) {
 this.age = age;
 }
 }
 
const 与 static final
- go
 go的静态(也可叫静态常量,主要用于基本数据类型),使用关键字const指定。
 使用const定义的静态变量是不可用修改或赋值的。const name int = 11 const (
 a = "hello"
 b = true
 c = 99
 ) func main() {
 fmt.Println(name)
 fmt.Println(a)
 fmt.Println(b)
 fmt.Println(c)
 }
- java
 java的常量需要用两个关键字修饰static和final,前者表示静态的意思,但这个静态是可以被修改的,
 修改的前提是类型不变,而第二个关键字表示最终的意思,一旦变量被这个关键字修饰则不可重新修改变量。
 但是对于复合对象,比如List、Map、自定义对象等,又是可以被修改的,对于这点个人觉得 java 的常量的定义
 并不够严谨。public class staticFinalTest {
 private static final Logger LOG = LoggerFactory.getLogger(staticFinalTest.class);
 private static final String name = "Tom"; private static String item = "first item"; private static final List<String> initArr = new ArrayList<String>(){{
 add("A");
 add("B");
 add("C");
 }}; @Test
 public void process(){
 LOG.info(name); item = "youth!"; LOG.info(item); initArr.add("hello"); LOG.info(initArr.toString());
 }
 }
参数或方法访问属性
- go 
 go 的方法或参数需要被外部访问,需要使用大写开头参数名或函数名(go文件大小写是与与否与是否私有无关)- // 可被文件外函数访问
 var Name string = "John" func main() {
 fmt.Println(Name)
 Process()
 } // 可被文件外函数调用
 func Process() {
 fmt.Println("Process()")
 }
- java 
 java的参数或方法属性不同于go,大致分为三类:- private 仅当前类内访问
- public 可公共访问
- protect 仅可同包内访问
 - public class ObjectTypeTest {
 private static final Logger LOG = LoggerFactory.getLogger(ObjectTypeTest.class); //私有访问(仅可同一类中)
 private String name1 = "name01";
 // 保护访问(仅可同一包内)
 protected String name2 = "name01";
 // 公共访问 (任何类均可访问)
 public String name3 = "name01"; @Test
 public void process(){
 LOG.info(this.doSomeThing());
 LOG.info(name1);
 LOG.info(name2);
 LOG.info(name3); } public String doSomeThing(){
 return "hello";
 } }
 
20190312_浅谈go&java差异(二)的更多相关文章
- 20190312_浅谈go&java差异(一)
		多线程 java java中对于大量的比较耗时的任务多采用多线程对方式对任务进行处理,同时由于进程和线程 本身是通过宿主机OS进行管理的,当在cpu核数较少或线程分配不当 会导致多线程的效果不佳的事常 ... 
- 20190608_浅谈go&java差异(三)
		20190608_浅谈go&java差异(三) 转载请注明出处https://www.cnblogs.com/funnyzpc/p/10990703.html 第三节内容概览 多线程通讯(线程 ... 
- 浅谈压缩感知(二十四):压缩感知重构算法之子空间追踪(SP)
		主要内容: SP的算法流程 SP的MATLAB实现 一维信号的实验与结果 测量数M与重构成功概率关系的实验与结果 SP与CoSaMP的性能比较 一.SP的算法流程 压缩采样匹配追踪(CoSaMP)与子 ... 
- 浅谈压缩感知(二十一):压缩感知重构算法之正交匹配追踪(OMP)
		主要内容: OMP的算法流程 OMP的MATLAB实现 一维信号的实验与结果 测量数M与重构成功概率关系的实验与结果 稀疏度K与重构成功概率关系的实验与结果 一.OMP的算法流程 二.OMP的MATL ... 
- 浅谈压缩感知(二十):OMP与压缩感知
		主要内容: OMP在稀疏分解与压缩感知中的异同 压缩感知通过OMP重构信号的唯一性 一.OMP在稀疏分解与压缩感知中的异同 .稀疏分解要解决的问题是在冗余字典(超完备字典)A中选出k列,用这k列的线性 ... 
- 【原创】浅谈指针(十二)关于static(上)
		0.前言 这个系列基本上是一月一更到两月一更 今天写一篇关于static的,内含大量干货,做好准备 1.基础知识的回顾 1.1.内存的种类 一般来说,我们之前已经讲过的变量(或者说是内存)可以大体分为 ... 
- 浅谈用java解析xml文档(二)
		上一文中总结了dom解析xml文档的方式,本文开始总结使用SAX解析xml 的方式及它的优缺点! SAX(Simple API for XML),是指一种接口,或者一个软件包. 首先我们应该知道SAX ... 
- 浅谈SEO-收录(二)
		如何更好的让搜索引擎收录网站中的内容,想要被良好的收录,可以尝试一下几点: 一.机器可读 百度通过一个叫做Baiduspider的程序抓取互联网上的网页, 经过处理后建入索引中,目前只支持读文本,fl ... 
- 安卓开发_浅谈Android动画(二)
		在学习了四个基本动画之后,现在要学习一些更有用的效果 先给出所有的动画xml <?xml version="1.0" encoding="utf-8"?& ... 
随机推荐
- 什么是渐进式框架 (vue.js)
			渐进式意味着你可以将 vue 作为你项目的一部分嵌入其中,带来更丰富的交互体验 
- iOS textView的使用总结
			转自:http://blog.csdn.net/zhaopenghhhhhh/article/details/11597887 在.h文件中声明: @interface ProtocolViewCon ... 
- React-Native项目在Android真机上调试
			目录 1.确保你的设备已经成功连接.可以终端输入adb devices来查看: 2.终端运行npm start 开启本地服务,成功后运行react-native run-android来在设备上安装并 ... 
- Xcode 10 Error: Multiple commands produce
			目录 Xcode 9.4.1运行react-native 可以,但是在Xcode 10运行报错,报错信息如下: 解决方法 1. 选择 File > Project Settings (或者 Fi ... 
- CF600E  Lomsat gelral (启发式合并)
			You are given a rooted tree with root in vertex 1. Each vertex is coloured in some colour. Let's cal ... 
- 笔记||Python3之再识函数
			变量的作用域: 全局变量 ----- 可以在函数内部被引用 局部变量 ----- 函数内部 -- 只能在函数里面使用,在函数外部不能使用 在函数内部修改全局变量:global x 缺省 ... 
- JavaScript 逻辑与(&&) 与  逻辑或(||) 运算规则
			逻辑与(&&) 逻辑与(&&)操作可以应用于任何的操作类型,不仅仅是布尔值, 在有一个操作数不是布尔值的情况下,&&操作符就不一定返回布尔值:遵循下面规 ... 
- Day 04 数据类型基础
			目录 什么是数据类型 为什么对数据分类 整型和浮点型统称为数字类型 整型(int) 作用 定义 使用方法 浮点型(float) 作用 定义 使用方法 强制类型转换 什么是字符串 作用 定义 使用方法 ... 
- 双重检查锁单例模式为什么要用volatile关键字?
			前言 从Java内存模型出发,结合并发编程中的原子性.可见性.有序性三个角度分析volatile所起的作用,并从汇编角度大致说了volatile的原理,说明了该关键字的应用场景:在这补充一点,分析下v ... 
- python学习-caculator
			# 运算符操作# 算术运算符num_a = 100num_b = 5000 # 加法print(num_a + num_b)# 减法print(num_a - num_b)# 乘法 *print(nu ... 
