一、go简介

1.Go语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布。Go 是非常年轻的一门语言,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。

2.Go语言是一种静态强类型、编译型、并发型、并具有垃圾回收功能的编程语言。

3. Go语言没有类和继承的概念,所以它和 Java 或 C++ 看起来并不相同。但是它通过接口(interface)的概念来实现多态性。Go语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之说。因此可以说Go语言是一门混合型的语言。

4. Go 使用编译器来编译代码。编译器将源代码编译成二进制(或字节码)格式;在编译代码时,编译器检查错误、优化性能并输出可在不同平台上运行的二进制文件。

5.为并发而生的语言。Go语言的并发是基于 goroutine 的,goroutine 类似于线程,但并非线程。可以将 goroutine 理解为一种虚拟线程。Go语言运行时会参与调度 goroutine,并将 goroutine 合理地分配到每个 CPU 中,最大限度地使用 CPU 性能。多个 goroutine 中,Go语言使用通道(channel)进行通信,通道是一种内置的数据结构,可以让用户在不同的 goroutine 之间同步发送具有类型的消息。这让编程模型更倾向于在 goroutine 之间发送消息,而不是让多个 goroutine 争夺同一个数据的使用权。

二、go基础数据结构和声明变量的方式

1.Go 语言数据类型包含基础类型和复合类型两大类。
基础数据类型包括:布尔型、整型、浮点型、复数型、字符型、字符串型、错误类型。
复合数据类型包括:指针、数组、切片、字典、通道、结构体、接口。

2.Go 语言在声明变量时会默认给变量赋个当前类型的空值,声明变量的方式:

go语言实战笔记 go语言详解_数组

A.布尔值

go语言实战笔记 go语言详解_go语言实战笔记_02

B.数字类型

Go语言的数字类型很多,这里我暂时只介绍常用到的几种。

go语言实战笔记 go语言详解_Go_03

C.数组

数组为一组相同数据类型数据的集合,数组定义后大小固定,不能更改,每个元素称为element,声明的数组元素默认值都是对应类型的0值。而且数组在Go语言中是一个值类型(value type),所有值类型变量在赋值和作为参数传递时都会产生一次复制动作,即对原值的拷贝。

go语言实战笔记 go语言详解_后端_04

D.切片

因为数组的长度定义后不可修改,所以需要切片来处理可变长数组数据。切片可以看作是一个可变长的数组,是一个引用类型。它包含三个数据:1.指向原生数组的指针,2.切片中的元素个数,3.切片已分配的存储空间大小
声明一个切片,或从数组中取一段作为切片数据

go语言实战笔记 go语言详解_go语言_05

go语言实战笔记 go语言详解_go语言_06

E.字符串

Go 语言默认编码都是 UTF-8

go语言实战笔记 go语言详解_go语言实战笔记_07

F.Map

map 是一种键值对的无序集合,与 slice 类似也是一个引用类型。map 本身其实是个指针,指向内存中的某个空间。
声明方式与数组类似,声明方式:var 变量名 map[key类型]值类型 或直接使用 make 函数初始化:make(map[key类型]值类型, 初始空间大小)
其中key值可以是任何可以用==判断的值类型,对应的值类型没有要求。

go语言实战笔记 go语言详解_Go_08

G. 指针

指针其实就是指向一个对象(任何一种类型数据、包括指针本身)的地址值,对指针的操作都会映射到指针所指的对象上。Go语言上的指针是不能改动的,基本就是用于查询获取数据的。并不需要依据指针来做垃圾回收

go语言实战笔记 go语言详解_Go_09

H. 通道channel

channel可以想象为一个指定了大小和容量的管道或传送带。我们可以在其一边放置内容,然后在另一边获取内容

声明:var 通道名 chan 通道传递值类型 或 make 函数初始化:make(chan 值类型, 初始存储空间大小)

go语言实战笔记 go语言详解_Go_10

输出:

//1

//a

//写入: 1

//写入: 2

//写入: 3

//读取: 1

//读取: 2

//读取: 3

//写入: 4

//写入: 5

//写入: 6

//读取: 4

//读取: 5

//读取: 6

//写入: 7

//写入: 8

//写入: 9

//读取: 7

//读取: 8

//读取: 9

I. 结构体struct

go语言实战笔记 go语言详解_Go_11

三、go并发

在Go语言中,语言本身就已经实现和支持了并发, Go语言并发体系的理论是C.A.R Hoare在1978年提出的CSP(Communicating Sequential Process,通讯顺序进程)。我们只需要通过go关键字来开启goroutine即可。gouroutine其实就是一种协程,类似其他语言中的coroutine, 是在编译器或虚拟机层面上的多任务。它可以运行在一个或多个线程上,但不同于线程,它是非抢占式的,所以协程很轻量。

1. 使用go关键字

go语言实战笔记 go语言详解_go语言_12

这张图的打印的hello world是无序的,因为go只是打开了一个协程。可以使用互斥量sync.Mutex来实现同步通信。

2. 使用channel

channel 是用来在不同goroutine之间进行通信的,无论传值还是取值,它都是阻塞的。

go语言实战笔记 go语言详解_Go_13

上图之所以会出现死锁,就是因为channel是阻塞的,在使用channel前先开一个goroutine去接收channel

go语言实战笔记 go语言详解_go语言实战笔记_14

四、总结

Golang在国内拥有较好的社区支持,还有很多优秀的开源项目,比如docker,k8s等,在微服务、区块链方面是极具竞争力的。