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"?& ...
随机推荐
- 用workspace管理工程,并解决多静态库依赖
from:http://www.cnblogs.com/perryxiong/p/3759818.html 最近我在项目中遇到一些工程之间的管理问题. 模型: 其中 库A 是一个公共的基础静态库, ...
- 2019CCPC秦皇岛 J MUV LUV EXTRA(KMP)
MUV LUV EXTRA Time Limit: 2000/1500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)T ...
- linux-export
使自定义普通变量转换为环境变量: 1. env查看环境变量 2. 设置临时环境变量,关机重启时不生效. export path=$path:/usr/sbin/ 3. 修改profile文件,关机重启 ...
- 【数据结构06】二叉平衡树(AVL树)
目录 一.平衡二叉树定义 二.这货还是不是平衡二叉树? 三.平衡因子 四.如何保持平衡二叉树平衡? 五.平衡二叉树插入节点的四种情况 六.平衡二叉树操作的代码实现 七.AVL树总结 @ 一.平衡二叉树 ...
- dapr微服务.netcore sdk入门
Actors入门 先决条件 .Net Core SDK 3.0 Dapr CLI Dapr DotNet SDK 概述 本文档描述如何在客户端应用程序上创建Actor(MyActor)并调用其方法. ...
- centos7 php(mariadb)安装pdo
环境:centos7+php5.4.16+mariadb5.5.52 在centos7环境下安装PDO,安装的时候都是自己分开安装的,先装的PHP(httpd)后装的mariadb. 数据库安装完成后 ...
- AJAX中的dataType
参考ajax的api文档 dataType的类型:String ajax中的dataType的属性: text:返回纯文本字符串 json:返回json数据 jsonp:jsonp格式(我没用过) h ...
- 一些实用的 Laravel 小技巧
Laravel 中一些常用的小技巧,说不定你就用上了. 1.侧栏 网站一般都有侧栏,用来显示分类,标签,热门文章,热门评论啥的,但是这些侧栏都是相对独立的模块,如果在每一个引入侧栏的视图中都单独导入与 ...
- CVPR 2019轨迹预测竞赛冠军方法总结
背景 CVPR 2019 是机器视觉方向最重要的学术会议,本届大会共吸引了来自全世界各地共计 5160 篇论文,共接收 1294 篇论文,投稿数量和接受数量都创下了历史新高,其中与自动驾驶相关的论文. ...
- python连接数据库使用SQLAlchemy
参考python核心编程 ORM(Object Relational Mapper),如果你是一个更愿意操作Python对象而不是SQL查询的程序员,并且仍然希望使用关系型数据库作为你的后端,那么你可 ...