来Javaer,学学go吧(一)

简介: Go与Java

一.关于Java


1.Java的用途


Java的主要用途和应用场景:
用途一:服务器后端系统开发(web后端、微服务后端支付系统、业务系统、管理后台,各种后台交互的接口服务)。
  用途二:大数据框架的底层实现和Java的API支持。(Hadoop)。
  用途三:其它中间件的底层开发。(Tomcat、RocketMq、Hbase、Kafka(部分)、SpringCloud,Dubbo...)。


2.Java的优势和特点


Java语言有什么优势和特点呢?
*.做服务端系统性能高。
  *.有虚拟机,跨平台。
  *.功能强大,支持的类库多,生态圈类库多,开发框架和工具更易找。
  *.市场占有率高,约60%的中国程序员都是做Java相关的工作。


二.关于Go


1.Go的出生原因


Go语言是Google内部公司大佬开发的,主要起因于Google公司有大量的C程序项目,但是开发起来效率太低,维护成本高,于是就开发了Go语言来提高效率,而且性能只是差一点。
(Go是2007年开始研发,2009推出发布)


2.宏观看Go与Java的差异


来看一下Go语言与Java的差异之处:
*.无虚拟机,不跨平台(这里的平台指操作系统)(可以运行多个平台,每个平台打不同的二进制程序包),需要打包编译成对应服务器操作系统版本(windows/linux)的可执行程序(比如windows是exe)。(注:说go跨平台的是指32位和64位相同操作系统之间的跨平台)
  *.因为Go程序直接打包成操作系统可执行的文件,没有虚拟机在中间转换的一层,所以理论上执行效率会更高(理论上更高,实际情况需具体分析)。
  *.相比Java的语言和代码编写风格,Go更简洁,可以用更少的代码实现同样的功能。
  *.Go语言层也是C实现的,又做了高并发的设计(Java出生时(1995)还没有多核cpu,所以他的并发支持后来添加上去的,Go(2009)出生时已经有了多核cpu的电脑,它在设计语言时就考虑了充分利用多核cpu(英特尔2005首次推出多核)的性能),所以性能高,高并发的支持(高并发支持其中指的一个就是充分利用多核cpu的性能资源,比如go程序默认使用所有cpu(除非自己设置使用多少))也好。
  *.天然的适用一些特定系统的开发,比如区块链类系统(如以太坊底层系统、以太坊上层应用程序),云计算和容器(Docker,K8s底层都是go开发的)开发的(大公司自研运维管理项目也大多是用go做底层的开发),网络编程(类似于java的Netty)。


3.Go和Java的语言类型区别


计算机编程语言按照运行的方式可以分为编译型编程语言和解释型编译语言。
    举一个例子,你要教别人一门沟通交流的语言,比如英语。
    编译型的教的方式就是录(这里的录相当于计算机中把程序编译成二进制可执行文件)一个视频课程,语音课程,把每一句英语发音录下来,这样学生学的时候只要播放你的录音,然后跟着读就行,你只需要录制一次,学生就可以无数次听。
   解释性的教的方式就是你亲自到学生家里给他补习,你当面教他,你读(读相当于每次执行都重新用解释器解释一遍)一句他学一句,

这样的话,你想要教他一句你必须就得先读一句,每次教都得重新一遍一遍的读。

这两种教学方式还有一个差别,你录(编译)视频语音教他,你录的英语他就只能学英语,空间环境一变,他现在要去日本,要学日语,你的视频语音教程因为已经录好了,是英语类型(英语类型类比操作系统类型)的,所以,你就得再录一套日语的语音教程。
   而现场教他,你也会日语的话,你只需要读(读相当于解释器解释)日语给他听,让他学就行了,是不用考虑语言环境(操作系统类型环境)不同的问题的。
   现在再来看编程语言,程序执行有两种方式,一种是编译成操作系统可执行的二进制可执行程序,这样相当于编译一次,之后每次执行都不用再编译了,但是因为不同操作系统对于二进制文件的执行规范不同,不同的操作系统你要编译成不同的可执行文件。
   解释型语言就是多了一个解释器,解释器我们可以类比为一个老师,你执行一行代码我们类比为学一句话的读音,解释器解释一句,就是老师先读一句,你跟着才能读一句,也就是解释器每解释一行代码为可运行的代码,操作系统执行一行代码,这样的话每次执行都需要解释器重新解释一遍,执行几次就得解释几次。
  Go是编译型的语言,运行在不同的平台需要打包成不同操作系统类型下的可执行文件。
    Java是半编译,半解释型语言。编译是指他的代码都会编译成class类型的文件,class类型的文件只需要编译一次,可以在不同的操作系统的Java虚拟机上执行 ,半解释是指在Java虚拟机中,他还是需要一句一句的将class的二进制代码解释成对应操作系统可执行的代码。


4.Go语言目前的主要应用场景


*.和Java一样,Go语言最多的应用场景就是服务器后端系统的开发,包括Web后端,微服务后端接口。
  *.Go非常适用需要高性能高并发的网络编程,这里的网络编程是指不需要界面,底层只是用Socket相互传输数据的系统,类似于Java中Netty的用途。
  *.一些云计算容器,比如Docker,K8s,底层就是Go语言开发的,也可以用做底层自研运维项目的开发。
  *.一些游戏系统的开发,可以用Go语言。
  *.区块链的一些底层软件和一些应用软件。(区块链程序的第一开发语言)


5.现在市场上都有哪些公司在使用Go语言?


直接BOSS直聘看哪些公司招,招的是干什么系统开发的。
  这是腾讯的一个岗位。

image.png

看看岗位描述,是做互联网金融 产品的业务系统开发,业务系统是啥意思,和JAVA后端业务系统一样啊,说明腾讯的一部分项目已经用Go来开发业务系统了, 至少他这个金融团队是这样的。听说腾讯云基本都是Go开发的。

再来看一个字节跳动的,也是开发内部流程自动部署自动运维程序的

image.png

再看华为的,好像Java架构师的要求啊,微服务,缓存,消息中间件,数据库。。。

image.png

这里不多看,自己看看去吧,大多数你能知道的大公司都有用go语言尝试的新部门,新项目,市场占有率虽然比Java少,但是岗位实际上蛮多的。


三.Go和Java微观对比


1.GoPath和Java的ClassPath


关于Java的classpath:


在我们的开发环境中,一个web程序(war包)有一个classpath,这个classpath在IDEA的开发工具中目录体现为src目录和resource目录,实际上在真正的war包中他定位的是指WEB-INF下的classes文件夹下的资源(比如class文件)。


编译后的文件都放在classpath(类路径)下。多个项目程序会有多个classpath目录。

在Go语言中,GoPath在同一系统上的同一用户,一般规定只有一个,无论这个用户创建多少个go项目,都只有一个GoPath,并且这些项目都放在GoPath下的src目录下。


GoPath下有三个目录:


1.bin (用于存放项目编译后的可执行文件)
          2.pkg     (用于存放类库文件,比如.a结尾的包模块)
          3.src    (用于存放项目代码源文件)  

注意:当我们在windows上开发Go程序时,需要新建一个文件夹(文件夹名任意)作为GOPATH的文件目录,在其中新建三个文件夹分别是:bin,pkg,src。如果是在集成开发工具上开发的话,需要在设置中把GOPATH路径设置为你自定义的那个文件夹,之后产生的文件和相关内容都会在其中。


如果是在linux上想跑测试开发执行go程序,需要在/etc/profile添加名为GOPATH的环境变量,目录设置好自己新建的。


例如:全局用户设置GOPATH环境变量


vi /etc/profile
#添加如下 目录可以灵活修改
export GOPATH=/pub/go/gopath
//立即刷新环境变量生效
source /etc/profile

单用户设置GOPATH环境变量

vi   ~/.bash_profile
#添加如下 目录可以自己灵活修改
export GOPATH=/home/user/local/soft/go/gopath
//立即刷新环境变量生效
source vi   ~/.bash_profile

注意:这是在linux上开发go程序才需要的,如果只是生产运行程序的话是不需要任何东西的,直接运行二进制可执行程序包即可,他所有的依赖全部打进包中了。


如果是在windows下的cmd,dos窗口运行相关的go命令和程序,则需要在windows的【此电脑】-->【右键】-->【属性】-->【高级系统设置】-->【环境变量】-【新建一个系统变量】-->【变量名为GOPATH,路径为你自己指定的自定义文件夹】(如果是在IDEA中开发,不需要在此配置环境变量,只需要在IDEA中配置好GOPATH的目录设置即可)


2.Go的开发环境搭建


(配置环境变量GOPATH参考上一节内容)

我们要开发Go的程序,需要如下两样东西:

1.Go SDK


GO中文社区SDK下载地址:https://studygolang.com/dl
go1.14
我们用1.14版就可以,因为1.13后才完全支持Module功能。
有两种安装模式,一种是压缩包解压的方式,一种是图形化安装。    
 推荐使用windows图形安装傻瓜式安装,windows图形安装下载这个
 https://studygolang.com/dl/golang/go1.14.6.windows-amd64.msi
 linux安装如下:
  后续补上。。。


  1. Go的集成软件开发环境


参考三(4)中的go集成开发环境选择。


3.Go与Java的文件结构对比


1).go文件结构模板


//主程序必须是写成main包名
package main
//导入别的类库
import "fmt"    
//全局常量定义
const  num = 10
//全局变量定义
var name string = "li_ming"
//类型定义
type P struct {
}
//初始化函数
func init() {
}
//main函数:程序入口
func main() {
  fmt.Printf("Hello World!!!");
}


2).Java文件结构


//包名
package my_package;
//导入包中的类
import java.io.*;
public Class MainTest{ 
  //main方法:程序入口
    public void static main(String[] args) {
  }
}
//people类
Class People {
  //成员变量
  public String name;
  public int age;
  //成员方法
  public void doSomething() {
  }
}


4.Go与Java的集成开发环境


1).Go的集成开发环境


最常用的有三种:
Visual Studio Code(VS Code) 微软开发的一款Go语言开发工具。
LiteIDE 是国人开发的Go语言开发工具。
GoLand 这个非常好用,和Java中的IDEA是一家公司。(推荐使用)


2).Java的集成开发环境


MyEclipse,Eclipse
IntelliJ IDEA(大多数用这个)。


5.Go和Java常用包的对比


Go中文API文档地址:
https://studygolang.com/pkgdoc
Go                                              Java         
IO流操作:      bufio/os                                     java.lang.io
字符串操作:      strings                                    java.lang.String
容器           container(heap/list/ring)                  java.lang.Collection
锁               sync                                       juc
时间              time                                      java.time/java.lang.Date
算数操作          math                                       java.math
底层Unsafe       unsafe                                     unsafe类       


6.Go的常用基础数据类型和Java的基础数据类型对比


1).go中的常用基础数据类型有:


1.布尔型:关键字【bool】: true   false
2.有符号整形:头一位是代表正负
            int   默认整形   4或8字节              32位或64位     
            int8             1字节                     8位
            int16            2字节                     16位
            int32            4字节                     32位
            in64             8字节                     64位
          【int是32还是64位取决于操作系统的位数,现在电脑一般都是64位的了,所以一般都是64位】
3.无符号整形
            uint             4或8字节             32位或64位
            uint8             1字节                     8位
            uint16            2字节                     16位
            uint32            4字节                     32位
            uint64            8字节                     64位
4.浮点型
            注:go语言没有float类型,只有float32和float64。
            float32           32位浮点数  
            float64           64位浮点数
5.字符串
            string
6. byte     等同uint8,只是类似于一个别名的东西
   rune     等同int32  只是一个别名,强调表示编码概念对应的数字


2).go中派生数据类型有:


注:这里简单列举一下
指针    Pointer
数组    Array[]
结构体   struct
进程管道: channel 
函数     func
切片    slice
接口    interface
哈希     map


3).Java中的基础数据类型


byte
short
int
long
float
double
boolean
char


7.Go和Java的变量对比


1).go的变量


package main
import(
   //包含print函数
   "fmt"
)
func main() {
   //var  变量名  变量类型 = 变量值
   var name string = "xiao_ming"
   //方法内部可以直接使用 【 变量名 := 变量值 】 赋值,方法外不可以
   name2:="xiao_hong"
   fmt.Println("name = ",name)
   fmt.Println("name2 = ",name2)
}


2).Java的变量


public class MyTest {
    public static void main(String[] args) {
        //变量类型  变量名 = 变量值
        String name = "steven";
        int i = 10;
        System.out.println("name ="+name);
        System.out.println("i ="+i);
    }
}


8.Go和Java的常量对比


1).go的常量


go中的常量和java中的常量含义有一个本质的区别:
go中的常量是指在编译期间就能确定的量(数据),
而java中的常量是指被赋值一次后就不能修改的量(数据)。
所以两者不一样,因为Java中的常量也是JVM跑起来后赋值的,只不过不允许更改;
go的常量在编译后就确实是什么数值了。
package main
import(
   //包含print函数
   "fmt"
)
func main() {
   //const  常量名  常量类型 = 常量值   显示推断类型
   const name string = "const_xiao_ming"
   //隐式推断类型
   const name2 ="const_xiao_hong"
   fmt.Println("name = ",name)
   fmt.Println("name2 = ",name2)
}


2).Java的常量


public class MyTest {
    //【访问修饰符】 【静态修饰符】final修饰符   常量类型   常量名 =  常量值;
    public static final String TAG = "A";    //一般设置为static静态
    public static void main(String[] args) {
        System.out.println("tag= "+TAG);
    }
}


相关文章
来Javaer,学学go吧(四)
在学go的过程中,也是一脸蒙蔽,语法和java有很大区别也很随意,直到学到goroutine,实现并发编程太方便简洁了,真香!
93 5
|
消息中间件 缓存 安全
来Javaer,学学go吧(三)
在学go的过程中,也是一脸蒙蔽,语法和java有很大区别也很随意,直到学到goroutine,实现并发编程太方便简洁了,真香!
75 0
|
架构师 Java 程序员
慢聊Go之Javaer转型|Go主题月
慢聊Go之Javaer转型|Go主题月
113 0
慢聊Go之Javaer转型|Go主题月
|
SQL Java 数据库连接
javaer to go之简单的ORM封装
身为一个做企业级开发的javaer,习惯使用hibernate、ibatis等ORM框架来操作数据库。虽然也发现golang也有ORM框架,像beego ORM等。 为了熟悉golang的一些特性,我还是觉得自己封装一个ORM。 <h1 id="1struct与interface
3459 0
|
网络协议 Java Go
javaer to go之TCP Socket与Goroutine
<div class="markdown_views"> <h1 id="1前言"> 1、前言</h1> <p>其实我前面一篇笔记的例子就是socket的一个例子,但是由于大部分的笔记说明都是在整理基础的东西,所以socket的笔记单独列在这里。</p> <p>server.go</p> <pre class="prettyprint"><code class=" h
2312 0
|
Go
javaer to go之byte类型转换
<div class="markdown_views"> <p>在Socket的Server和Client通信的过程中,传输的都是字节。而我们需要展示和使用的是字符串、整形等。这个时候,我们需要对字节进行处理,把byte类型的数据转成我们需要的类型。</p> <h2 id="1byte与16进制字符串">1、[]byte与16进制字符串</h2> <ul> <li>[]by
2159 0
|
SQL 关系型数据库 MySQL
javaer to go之mysql操作
<div class="markdown_views"> <p>经过度娘后,发现比较常用golang mysql驱动包有两种mymysql和go-sql-driver/mysql。个人觉得mymysql这个名字起得不够文雅。所以我选择了go-sql-driver/mysql。</p> <h2 id="1go-sql-drivermysql的安装">1、go-sql-drive
2045 0
|
Java Go 网络协议
javaer to go之基础
<div class="markdown_views"> <h2 id="1开始">1、开始</h2> <p>我是一个javaer,最近空闲时间在学习golang。</p> <p>度娘后,安装好Go环境和LiteIDE后,一开始我也没从基础开始看,而是想把现有的java项目改成是golang版本的。</p> <p>原项目内容:</p> <ol> <li>socket模块
1930 0
|
4天前
|
数据采集 存储 Go
使用Go语言和chromedp库下载Instagram图片:简易指南
Go语言爬虫示例使用chromedp库下载Instagram图片,关键步骤包括设置代理IP、创建带代理的浏览器上下文及执行任务,如导航至用户页面、截图并存储图片。代码中新增`analyzeAndStoreImage`函数对图片进行分析和分类后存储。注意Instagram的反爬策略可能需要代码适时调整。
使用Go语言和chromedp库下载Instagram图片:简易指南