JAVA开发者的Golang快速指南
Golang作为Docker、Kubernetes和OpenShift等一些酷辣新技术的首选编程语言,越来越受欢迎。尤其它们都是开源的,很多情况下,开源是非常有价值的。深入学习阅Golang等源代码库中的源文件,可以更深地理解它们,同时也有利于其他编程语言的开发者快速映射某些概念,比如Go与Java中常用概念的映射。本文的目的是帮助Java开发人员快速理解一些常见的Go习惯用法。
项目结构
Golang项目的一个常见约定是将所有cli二进制源文件或“main”包中的源文件放在根目录cmd文件夹下。通常可以在源根目录的pkg文件夹中找到实现了不同功能的内聚类型、常量、变量和函数集的包。
包
Golang将其代码组织成包,类似于Java。通过在源文件的顶部引入package来声明源文件所在的包(以及它的所有常量、类型、函数等)。但是与Java不同,不需要输入完整的包名+类名的路径,只需要输入包名即可。例如:
package api
假设有一个包“api/endpoint”,那么文件系统上就会有这个目录结构(例如:/pkg/api/endpoint),但是endpoint包在endpoint目录下的源文件中的声明,应该是这样的:
package endpoints
导入包
使用以下命令可以在程序中导入包,就像在Java中一样:
import (
stderrs "errors"
"time"
"Golang.org/x/net/context"
"k8s.io/kubernetes/pkg/auth/user"
)
可以根据包路径中的最后一个包名在源代码中使用包。例如,在上面的例子中,我们导入k8s.io/kubernetes/pkg/auth/user,通过代码,可以用user.Foo()引用包中的元素。同样也可以在源文件中重命名包,这样它就不会与其他包名发生冲突,就像上面例子里所示:
import (
stderrs "errors"
)
并在自己的程序源码中直接引用stderrs.Foo()。
Main包
main包是Golang应用程序的入口点。main包必须有一个main()函数,该函数不接受参数,也不提供返回值。例如:
func main() { … }
如前所述,这个包通常位于根目录的cmd文件夹中。
类型、常量、函数的作用域/可见性
在Golang中,对于结构/类型/函数/变量在包外部的作用域和可见性,其标识符的首字符非常重要。例如,在一个foo包中,如果有一个名为func Bar()的函数,那么因为“Bar”的第一个字母是大写的,所以它在包之外是可用的(注:类似于java中的public)。因此,如果导入了foo包,就能够调用foo.Bar()函数。如果“bar”是小写的,它将被隐藏起来(类似于java中的private)。也就是说,第一个字母的大小写决定了其作用域与可见性。
方法可以返回多个值
Golang中的函数或方法(两者有区别)可以返回“元组”或多个值,与java有明显差异。例如,调用一个返回多个值的函数如下所示:
internalCtx, ok := foo.bar(context.Context)
其中,internalCtx表示函数内容,ok可表示函数调用成功或失败标识。
类、结构、方法
在Java中有类,但在Go中与之相似的概念是结构体(Struct)。struct也可以有成员和方法。如下所示:
type Rectangle struct {
width int
height int
}
这是一个名为“Rectangle”的数据结构,它有两个成员变量(也可以称为字段,原文中为fields):宽度和高度。可以像这样创建实例:
r := new(Rectangle)
还可以这样引用它的成员变量(fields):
r.width = 10
r.height = 5
我们可以在“Rectangle”数据结构上编写方法,如下所示:
func (r *Rectangle) area() int {
return r.width * r.height
}
这里的方法名称为area,可以这么来调用上面的方法:
r := new(Rectangle)
r.area()
类型继承
Golang在设计上未采用Java的“继承(extends)”,它的继承是通过组合来完成的。例如:
type Rectangle struct {
Shape
width int
height int
}
上面Rectangle结构中有一个类型为Shape的匿名成员。Shape中包含的所有字段和方法在Rectangle对象上都是可见的。但是需要注意的是,不像在Java中,可以将Rectangle传递给Shape为参数的函数,这在Go中是行不通的。要获得这种类型的多态性,应该使用Go接口。
多态性、接口
在Java中有特定的接口类型,这些接口类型定义了对象的行为。在Go中,也有类似的概念,可以通过intefaces来实现。例如,下面这个接口声明了一个具有Print()方法的Shape类型:
type Shape interface {
Print()
}
当使用Go来创建结构时,不需要像在Java中那样用“implementation”来声明它。它是隐式的,只需要实现了该接口对应的方法,对应的结构体就可以被传递给需要的函数:
type Rectangle struct {
width int
height int
}
func (r *Rectangle) Print() {
fmt.println("Rectangle!");
}
此时,Rectangle对象可以传递给任何接收Shape类型的函数,因为它实现了该类型的所有方法。
For循环
Go中的For循环,样例如下:
for i := 1; i <= 10; i++ {
fmt.Println(i)
}
然而,当迭代一个数组(或类似于数组的东西,例如,字符串,映射,切片等),可以使用range运算符(假设foo是一个列表List):
for v := range foo {
fmt.println("value="+v);
}
如果在遍历列表时需要知道该列表的索引,则可以这样编写代码:
for i, v := range foo {
fmt.println("index " + i +"has value="+v);
}
While循环
Go中还可以像这样再次使用for循环:
sum := 1
for sum < 1000 {
sum += sum
}
fmt.Println(sum)
或者实现一个无限while循环:
for {
something...
}
指针和引用
Golang中需要显式地使用指针和引用,而Java通常隐藏这些。例如,Java中可以这样做:
Shape shape = new Shape();
shape.foo();
但是在Go中,必须直接处理指针:
type Rectangle struct {
width int
height int
}
func updateRectangle(r *Rectangle){
r.width = 5;
r.height = 10;
}
func main() {
r := Rectangle{20,30}
updateRectangle(&r)
}
当main函数执行完毕时,Rectangle对象中r.width=5,r.height=10。注意:必须显式地引用指针。
垃圾回收机制
Golang与java类似,也是一种垃圾收集语言。Go开发者不需要手动来释放程序中不再使用的变量和结构占用的内存,在Go的运行时中有一个独立的进程,即垃圾收集器(GC),会处理这些事,它会通过标记算法搜索不再使用的变量然后释放内存。
通过调用runtime.GC()函数可以显式的触发GC,但这只在某些特殊的场景下才会使用,比如当内存资源不足时调用runtime.GC(),它会在此函数执行的点上立即释放内存,此时程序可能会有短时的性能下降(由于GC进程的执行)。如果想知道当前的内存状态,也可以使用如下代码:
var mruntime.MemStats
runtime.ReadMemStats(&m)
fmt.Printf("%dKb\n", m.Alloc / 1024)
上面的程序会给出已分配内存的总量,单位是 Kb。
原文作者:Christian Posta 译者:江玮
原文链接:https://dzone.com/articles/quick-go-lang-for-java-developers
版权声明:本文版权归作者(译者)及公众号所有,欢迎转载,但未经作者(译者)同意必须保留此段声明,且在文章页面明显位置给出,本文链接如有问题,可留言咨询。
转载于:https://www.cnblogs.com/davidwang456/p/10327880.html
JAVA开发者的Golang快速指南相关推荐
- gr java ch,Apache POI 快速指南.pdf
Apache POI PPT - 快速指南 Apache POI PPT - 概述 很多时候,需要⼀个软件应⽤程序来⽣成Microsoft Office⽂件格式的报告. 有时,应 ⽤程序甚⾄希望接 M ...
- java中的topicFont_Fontmin 快速指南
Fontmin 是一个纯 JavaScript 实现的字体子集化方案. 提供了 ttf 子集化,eot/woff/svg 格式转换,css 生成 等功能,助推 webfont 发展,提升网页文字体验. ...
- openshift java_在OpenShift上部署Java应用程序的快速指南
在本文中,我将向您展示如何在OpenShift(Minishift)上部署应用程序,将它们与其中暴露的其他服务连接起来,还是使用由OpenShift提供的其他一些有趣的部署功能.OpenShift构建 ...
- 针对Java开发者的持续交付完整实施指南 | 内含福利
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作为一名开发者,您在开发完自己的应用之后,是否有去了解过 ...
- Redis高频面试笔记:面向Java开发者的复习指南
前言 Redis作为基于键值对的NoSQL数据库,具有高性能.丰富的数据结构.持久化.高可用.分布式等特性,同时Redis本身非常稳定,已经得到业界的广泛认可和使用.因此,作为一个Java开发者,掌握 ...
- oauth2_带有Spring Security的OAuth 2.0快速指南
oauth2 "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验 ...
- 从 C++ 到 Objective-C 的快速指南 【已翻译100%】
**简介 ** 当我开始为iOS写代码的时候,我意识到,作为一个C++开发者,我必须花费更多的时间来弄清楚Objective-C中怪异的东西.这就是一个帮助C++专家的快速指南,能够使他们快速的掌握A ...
- 带有Spring Security的OAuth 2.0快速指南
"我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 在构建W ...
- 调查 10,500 名 Java 开发者发现,收费的 OracleJDK 仍是主流、IntelliJ IDEA 最受欢迎...
昨日,作为"第一家"公开宣布将裁员 15% 的滴滴,一时之间被大众推向了舆论的风口浪尖,但与此同时,因为其不变相且透明的裁员举措也为自己赢得了一片叫好声.然不可否认的是,从此事件乃 ...
最新文章
- 程序员必知8大排序3大查找(三)
- Docker创建Gitea(git服务)
- 第一个PhoneGap程序以及错误解决
- python 虚拟环境依赖复制
- mysql启动错误1067进程意外终止的解决方法
- 标本兼治:企业应揪出网络漏洞元凶
- error: 'for' loop initial declarations are only allowed in C99 mode
- C语言 指针在函数传参中的使用
- AI x 量化:华尔街老司机解密智能投资正确姿势
- EasyExcel快速上手~读取
- new_picview_一款漂亮的图片查看器PictureViewer
- .NET的资源并不限于.resx文件,你可以采用任意存储形式[上篇] (转载)
- STM32学习(1)-资料查找,STM32简介,STM32选型以及芯片内部结构图
- 求大于某数的最小素数Python版
- NPV、IRR的计算
- python 让电脑发出声音代码_python - 代码完成时发出声音警报
- android本地视频 投屏,小米投屏神器
- 算法竞赛入门经典阅读心得
- Java实现 蓝桥杯VIP 算法提高 扫雷
- (一)传说中“哈佛最受欢迎的课程”
热门文章
- mysql不同服务器数据库查询_不同服务器不同数据库两张表连接查询使用经验
- 中采购订单批导的bapi_跟着团子学SAP PS—项目中的物料组件
- 三天流量有效期具体怎么算_信用证具体的费用怎么算?
- java项目中怎么查看用的序列_如何在Java应用程序中使用序列化分类器对...
- JVM、JRE和JDK的概念
- 用邮箱实现多事件的单向同步
- Qt中的QMessageBox
- php mysql update 返回_php mysql_query增删改查(update delete insert)返回值类型
- mysql innodb 排他锁_MySQL 针对 InnoDB 引擎锁的种类:行锁(共享锁和排他锁)和表锁(意向共享锁和意向排他锁)...
- Ubuntu20.04软件源更换