转载请注明出处: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的常量需要用两个关键字修饰 staticfinal ,前者表示静态的意思,但这个静态是可以被修改的,

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

    但是对于复合对象,比如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差异(二)的更多相关文章

  1. 20190312_浅谈go&java差异(一)

    多线程 java java中对于大量的比较耗时的任务多采用多线程对方式对任务进行处理,同时由于进程和线程 本身是通过宿主机OS进行管理的,当在cpu核数较少或线程分配不当 会导致多线程的效果不佳的事常 ...

  2. 20190608_浅谈go&java差异(三)

    20190608_浅谈go&java差异(三) 转载请注明出处https://www.cnblogs.com/funnyzpc/p/10990703.html 第三节内容概览 多线程通讯(线程 ...

  3. 浅谈压缩感知(二十四):压缩感知重构算法之子空间追踪(SP)

    主要内容: SP的算法流程 SP的MATLAB实现 一维信号的实验与结果 测量数M与重构成功概率关系的实验与结果 SP与CoSaMP的性能比较 一.SP的算法流程 压缩采样匹配追踪(CoSaMP)与子 ...

  4. 浅谈压缩感知(二十一):压缩感知重构算法之正交匹配追踪(OMP)

    主要内容: OMP的算法流程 OMP的MATLAB实现 一维信号的实验与结果 测量数M与重构成功概率关系的实验与结果 稀疏度K与重构成功概率关系的实验与结果 一.OMP的算法流程 二.OMP的MATL ...

  5. 浅谈压缩感知(二十):OMP与压缩感知

    主要内容: OMP在稀疏分解与压缩感知中的异同 压缩感知通过OMP重构信号的唯一性 一.OMP在稀疏分解与压缩感知中的异同 .稀疏分解要解决的问题是在冗余字典(超完备字典)A中选出k列,用这k列的线性 ...

  6. 【原创】浅谈指针(十二)关于static(上)

    0.前言 这个系列基本上是一月一更到两月一更 今天写一篇关于static的,内含大量干货,做好准备 1.基础知识的回顾 1.1.内存的种类 一般来说,我们之前已经讲过的变量(或者说是内存)可以大体分为 ...

  7. 浅谈用java解析xml文档(二)

    上一文中总结了dom解析xml文档的方式,本文开始总结使用SAX解析xml 的方式及它的优缺点! SAX(Simple API for XML),是指一种接口,或者一个软件包. 首先我们应该知道SAX ...

  8. 浅谈SEO-收录(二)

    如何更好的让搜索引擎收录网站中的内容,想要被良好的收录,可以尝试一下几点: 一.机器可读 百度通过一个叫做Baiduspider的程序抓取互联网上的网页, 经过处理后建入索引中,目前只支持读文本,fl ...

  9. 安卓开发_浅谈Android动画(二)

    在学习了四个基本动画之后,现在要学习一些更有用的效果 先给出所有的动画xml <?xml version="1.0" encoding="utf-8"?& ...

随机推荐

  1. 学习ThinkPHP的第20天--MySQL事务操作、查询事件、一对一关联

    之所以从20天才开始写随笔记是因为之前没搞自己的博客 从20天开始记录我在ThinkPHP中的点点滴滴 1.MySQL事务操作 /**事务操作*/ //startTrans启动事务.rollback回 ...

  2. react-native scrollview触摸滚动事件

    目录 1.几个已知的滑动或者滑动开始结束的方法: 2.还有其他的一些事件如下 3.下面就这些方法的顺序做个简单的介绍: 4.android上的时间分为两种,一个是滑动一次,一个是连续滑动两次甚至多次, ...

  3. dockerfile 最佳实践及示例

    Dockerfile 最佳实践已经出现在官方文档中,地址在 Best practices for writing Dockerfiles.如果再写一份最佳实践,倒有点关公门前耍大刀之意.因此本篇文章是 ...

  4. 最全的linux系统安装教程和排错方法

    第4章 linux信息和系统安装与连接    260 4.1 linux的发展历史    260 4.2 GPL协议,FSF协议    261 4.3 linux系统的安装    261 4.3.1 ...

  5. [vue]数据来源

    1.组件data函数return的数据 作用域是组件本身 可以在模板template及计算属性computed和方法methods中使用 2.父传子,props数据 来自父级:可以是写死的,或者是来自 ...

  6. 进程-(process)、线程-(Thread)

    进程和线程之间的区别: 内存之间的区别: 进程之间不可以共享内存空间,每个进程都有各自独立的内存空间: 线程之间则是可以共享一个进程里的内存空间: 通信机制方面的区别 默认情况下,进程之间很难互通的, ...

  7. Linux-部署-Django

    Linux-部署-Django-项目过程与问题总结 优才网 2017-04-12 18:00   本篇主要用于记录部署 Django 项目所有踩过的坑. 最近学习 Django 框架开发,将项目部署到 ...

  8. VS Code 成主宰、Vue 备受热捧!2019 前端开发趋势必读

    前端在生产和开发中占据着越来越重要的地位,PC 端.手机端.桌面端.智能手表端等等设备都离不开前端的身影.本文将围绕框架.编程语言.工具.React.Vue 等方面,全面回顾 2019 年前端与 We ...

  9. Django day03之学习知识点

    今日是路由层学习: 3.路由匹配 3.1 正则表达式的特点: 一旦正则表达式能够匹配到内容,会立刻结束匹配关系 直接执行对应的函数.相当于采用就近原则,一旦找到就不再继续往下走了 重点: 正则表达式开 ...

  10. 这几种JavaScript语法不要轻易使用,容易出事

    文章目录 12种不宜使用的JavaScript语法 1. == 2. with 3. eval 4. continue 5. switch 贯穿 6. 单行的块结构 7. ++和-- 8. 位运算符 ...