Java程序员Go语言入门简介
为什么是Go语言
- 类C的语法,这意味着Java、C#、JavaScript程序员能很快的上手
- 有自己的垃圾回收机制
- 跨平台、编译即可执行无需安装依赖环境
- 支持反射
Go语言简介
Go 语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布。Go 是非常年轻的一门语言,它的主要目标是“兼具Python等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。
数据类型
数据类型 | 说明 |
---|---|
bool | 布尔 |
string | 字符串 |
int | uint8,uint16,uint32,uint64,int8,int16,int32,int64 |
float | float32,float64 |
byte | byte |
参考:https://www.runoob.com/go/go-data-types.html
基本语法
HelloWorld
在线运行示例:https://play.golang.org/p/-4RylAqUV36
1 | package main |
我们来执行一下:
1 | go run main.go # main.go 为刚刚创建的那个文件的名称 |
变量
变量声明
在线运行示例:https://play.golang.org/p/zPqCkRZgrgp
1 | package main |
类型推断
在线运行示例:https://play.golang.org/p/0My8veBvtJ8
1 | package main |
函数
- 函数可以有多个返回值
- 隐式的指定函数是private还是public,函数首字母大写的为public、小写的为private
- 没有类似Java中的
try cache
、throw
,Go语言是通过将error
作为返回值来处理异常。 - 不支持重载
下面我们通过一个示例来了解一下,在线运行示例:https://play.golang.org/p/PYy3ueuPFS6
1 | package main |
该示例输出结果为:
1 | execute func log1 |
但函数有多个返回值的时候,有时你只关注其中一个返回值,这种情况下你可以将其他的返回值赋值给空白符:_
,如下:
1 | _, err := Add2(1, 2) |
空白符特殊在于实际上返回值并没有赋值,所以你可以随意将不同类型的值赋值给他,而不会由于类型不同而报错。
结构体
Go语言不是像Java那样的面向对象的语言,他没有对象和继承的概念。也没有class
的概念。在Go语言中有个概念叫做结构体(struct
),结构体和Java中的class
比较类似。下面我们定义一个结构体:
1 | type User struct { |
上面我们定义了一个结构体User
,并为该结构体分别设置了三个公有属性:Name/Gender/Age,下面我们来创建一个User对象。
1 | user := User{ |
结构体的属性可以在结构体内直接声明,那么如何为结构体声明函数(即Java中的方法)呢,我们来看下下面的示例:在线运行示例:https://play.golang.org/p/01_cTu0RzdH
1 | package main |
指针类型和值类型
Java中值类型和引用类型都是定死的,int、double、float、long、byte、short、char、boolean为值类型,其他的都是引用类型,而Go语言中却不是这样。
在Go语言中:
&
表示取地址,例如你有一个变量a
那么&a
就是变量a
在内存中的地址,对于Golang指针也是有类型的,比如a是一个string那么&a是一个string的指针类型,在Go里面叫&string。*
表示取值,接上面的例子,假设你定义b := &a
如果你打印b
,那么输出的是&a
的内存地址,如果要取值,那么需要使用:*b
下面我们来看下例子,在线运行:https://play.golang.org/p/jxAKyVMjnoy
1 | package main |
并发编程
Go语言的并发是基于 goroutine 的,goroutine 类似于线程,但并非线程。可以将 goroutine 理解为一种虚拟线程。Go语言运行时会参与调度 goroutine,并将 goroutine 合理地分配到每个 CPU 中,最大限度地使用CPU性能。
Go 程序从 main 包的 main() 函数开始,在程序启动时,Go 程序就会为 main() 函数创建一个默认的 goroutine。
下面我们来看一个例子(在线演示:https://play.golang.org/p/U9U-qjuY0t1)
1 | package main |
执行结果说明fuck函数中的sleep三秒并没有影响喜特
的输出。
如果说 goroutine 是Go语言程序的并发体的话,那么 channel 就是它们之间的通信机制。一个 channel 是一个通信机制,它可以让一个 goroutine 通过它给另一个 goroutine 发送值信息。每个 channel 都有一个特殊的类型,也就是 channel 可发送数据的类型。一个可以发送 int 类型数据的 channel 一般写为 chan int。
下面我们利用goroutine+channel来实现一个生产消费者模型,示例代码如下:(在线执行:https://play.golang.org/p/lqUBugLdU-I)
1 | package main |
Java程序员觉得不好用的地方
- 异常处理
- 没有泛型
- 不支持多态、重载
- 不支持注解(但是他的struct中的属性支持
tag
)
参考
Java程序员Go语言入门简介