文章目录

文章目录

Golang概述

Go语言三大牛

谷歌创造Golang的原因

Golang 的发展历程

Golang 的语言的特点

Go语言开发工具

Go开发环境配置(sdk下载及配置)

使用开发工具创建第一个Go项目

Go 程序开发的注意事项

官方参考文档

Go学习

Go变量

数据类型

基本数据类型说明

浮点型

字符

字符类型本质探讨

布尔型

字符串

指针

值类型与引用类型

相关示例代码

运行结果

指针相关图示

标识符

概念

标识符的命名规则

保留关键字

预留关键字

运算符

算数运算符一览表

关系运算符

细节说明

逻辑运算符

赋值运算符

位运算符

其他运算符

特别说明(三元运算符)

运算符优先级

键盘输入语句

代码示例

运行结果

程序流程控制

顺序流程

分支控制

循环控制

跳转控制(break/continue/goto)

生成随机数

数组

切片

映射(map)

函数


文章目录

Golang概述

Go语言三大牛

image.png

谷歌创造Golang的原因

image.png

Golang 的发展历程

2007 年,谷歌工程师 Rob Pike, Ken Thompson 和 Robert Griesemer 开始设计一门全新的语言,这是 Go 语言的最初原型。

2009 年 11 月 10 日,Google 将 Go 语言以开放源代码的方式向全球发布。

2015 年 8 月 19 日,Go 1.5 版发布,本次更新中移除了”最后残余的 C 代码”

2017 年 2 月 17 日,Go 语言 Go 1.8 版发布。

2017 年 8 月 24 日,Go 语言 Go 1.9 版发布。 1.9.2 版本

2018 年 2 月 16 日,Go 语言 Go 1.10 版发布。

Golang 的语言的特点

Go 语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发维护的高效率 ,使用一个表达式来形容 Go 语言:Go = C + Python , 说明 Go 语言既有 C 静态语言程序的运行速度,又能达到 Python 动态语言的快速开发。


从 C 语言中继承了很多理念,包括表达式语法,控制结构,基础数据类型,调用参数传值,

等,也保留了和 C 语言一样的编译执行方式及弱化的指针


举一个案例(体验):

//go 语言的指针的使用特点(体验)

func testPtr(num *int) {

*num = 20

}

  1. 引入包的概念,用于组织程序结构,Go 语言的一个文件都要归属于一个包,而不能单独存在。

垃圾回收机制,内存自动回收,不需开发人员管理

天然并发 (重要特点)

从语言层面支持并发,实现简单

goroutine,轻量级线程,可实现大并发处理,高效利用多核。

基于 CPS 并发模型(Communicating Sequential Processes )实现

吸收了管道通信机制,形成 Go 语言特有的管道 channel 通过管道 channel , 可以实现不同的 goroute

之间的相互通信。


函数可以返回多个值。举例:

//写一个函数,实现同时返回 和,差

//go 函数支持返回多个值

func getSumAndSub(n1 int, n2 int) (int, int ) {

sum := n1 + n2 //go 语句后面不要带分号.

sub := n1 - n2

return sum , sub

}


新的创新:比如切片 slice、延时执行 defer

Go语言开发工具

我使用的是GoLand开发工具,比较顺手

GoLand 是 JetBrains 公司推出的 Go 语言集成开发环境。GoLand 同样基于 IntelliJ 平台开发,支持 JetBrains 的插件体系。


下载地址:https://www.jetbrains.com/go/download/other.html

自己选择喜欢的版本和相应的系统下载,不建议使用太新的版本,我自己用2021.3.5版本比较顺手


账号的话可以去淘宝买教育注册渠道,注册后可以使用一年

或者使用插件无限使用30天(⚠️注意21年及之前的可以使用,相对新的版本不支持),相关文档地址:https://blog.csdn.net/qq_37699336/article/details/116528062


Go开发环境配置(sdk下载及配置)

SDK 下载地址:Golang 中国 https://www.golangtc.com/download

sdk配置相关参考文档:https://blog.csdn.net/m0_49589654/article/details/127259754


使用开发工具创建第一个Go项目

创建一个项目,选择好sdk的路径就可以了

1.png

右击项目文件创建一个go file

1.png

image.png

之后写个hello word

运行

1.png

Go 程序开发的注意事项

Go 源文件以 “go” 为扩展名。

Go 应用程序的执行入口是 main()函数。 这个是和其它编程语言(比如 java/c)

Go 语言严格区分大小写。

Go 方法由一条条语句构成,每个语句后不需要分号(Go 语言会在每行后自动加分号),这也体现出 Golang 的简洁性。

Go 编译器是一行行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一个,否

则报错


go 语言定义的变量或者 import 的包如果没有使用到,代码不能编译通过。

大括号都是成对出现的,缺一不可。


官方参考文档

Golang 官方网站(可能访问不了): https://golang.org

Golang 中文网 在线标准库文档: https://studygolang.com/pkgdoc


Go学习

Go变量

概念:变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,同样的道理,通过变量名可以访问到变量 (值)。


变量的使用步骤:声明变量(也叫:定义变量) -> 非变量赋值 -> 使用变量

运行结果

运行结果

数据类型

1.png

基本数据类型说明

整型数据

分为两类,有符号和无符号两种类型


有符号: int, int8, int16, int32, int64

无符号: uint, uint8, uint16, uint32, uint64, byte

不同位数的整型区别在于能保存整型数字范围的大小;

有符号类型可以存储任何整数,无符号类型只能存储自然数

int和uint的大小和系统有关,32位系统表示int32和uint32,如果是64位系统则表示int64和uint64

byte与uint8类似,一般用来存储单个字符

在保证程序正确运行下,尽量使用占用空间小的数据类型

fmt.Printf(“%T”, var_name)输出变量类型

unsafe.Sizeof(var_name)查看变量占用字节


浮点型

浮点型也就是小数类型,可以存放小数。比如6.6,-12.34

1、关于浮点数在机器中存放形式的简单说明,浮点数=符号位+指数位+尾数位

2、尾数部分可能丢失,造成精度损失。-123.0000901

3、浮点型的存储分为三部分:符号位+指数位+尾数位,在存储过程中,精度会有丢失

4、golang的浮点型默认为float64类型

5、通常情况下,应该使用float64,因为它比float32更精确

6、0.123可以简写成.123,也支持科学计数法表示:5.1234e2 等价于512.34


字符

Golang中没有专门的字符类型,如果要存储单个字符(字母),一般使用byte来保存。

字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的,也就是说对于传统的字符串是由字符组成的,而Go的字符串不同,它是由字节组成的。


字符只能被单引号包裹,不能用双引号,双引号包裹的是字符串

当我们直接输出type值时,就是输出了对应字符的ASCII码值

当我们希望输出对应字符,需要使用格式化输出

Go语言的字符使用UTF-8编码,英文字母占一个字符,汉字占三个字符

在Go中,字符的本质是一个整数,直接输出时,是该字符对应的UTF-8编码的码值。

可以直接给某个变量赋一个数字,然后按格式化输出时%c,会输出该数字对应的unicode字符

字符类型是可以运算的,相当于一个整数,因为它们都有对应的unicode码

字符类型本质探讨

字符型存储到计算机中,需要将字符对应的码值(整数)找出来存储:字符 --> 码值 --> 二进制 --> 存储读取: 二进制 -->码值 --> 字符 --> 读取

字符和码值的对应关系是通过字符编码表决定的(是规定好的)

Go语言的编码都统一成了UTF-8。非常的方便,很统一,再也没有编码乱码的困扰了

布尔型

布尔类型也叫做bool类型,bool类型数据只允许取值true或false

bool类型占1个字节

bool类型适用于逻辑运算,一般用于流程控制


字符串

字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本

1、字符串一旦赋值了,就不能修改了:在Go中字符串是不可变的。

2、字符串的两种标识形式


指针

基本数据类型,变量存的就是值,也叫值类型

获取变量的地址,用&,比如var num int,获取num的地址:&num

指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值,比如:var ptr *int = &num

获取指针类型所指向的值,使用:*,比如,var ptr int,使用ptr获取ptr指向的值

指针细节说明:


值类型,都有对应的指针类型,形式为数据类型,比如int对应的指针就是int,float64对应的指针类型就是*float64,依此类推。

值类型包括:基本数据类型、数组和结构体struct


值类型与引用类型

值类型和引用类型使用特点:

值类型:变量直接存储值,内存通常在栈中分配

引用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据(值),内存通常在堆上分配,当没有任何变量应用这个地址时,该地址对应的数据空间就成为一个垃圾,由GC来回收。

Golang中值类型和引用类型的区分


值类型:基本数据类型(int系列、float系列、bool、string)、数组和结构体

引用类型:指针、slice切片、map、管道chan、interface等都是引用类型

相关示例代码

运行结果

指针相关图示

1.png

标识符

概念

Golang 对各种变量、方法、函数等命名时使用的字符序列称为标识符 ,凡是自己可以起名字的地方都叫标识符。


标识符的命名规则

由 26 个英文字母大小写,0-9 ,_ 组成

数字不可以开头。var num int //ok var 3num int //error

Golang 中严格区分大小写。

在 golang 中,num 和 Num 是两个不同的变量 (var num int

,var Num int )


标识符不能包含空格。

下划线"_"本身在 Go 中是一个特殊的标识符,称为空标识符。可以代表任何其它的标识符,但

是它对应的值会被忽略(比如:忽略某个返回值)。所以仅能被作为占位符使用,不能作为标识符使用


不能以系统保留关键字作为标识符(一共有 25 个),比如 break,if 等等…

保留关键字

1.png

预留关键字

1.png

运算符

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等

算数运算符一览表

1.png

1.png

关系运算符

1.png

细节说明

关系运算符的结果都是 bool 型,也就是要么是 true,要么是 false。

关系运算符组成的表达式,我们称为关系表达式: a > b

比较运算符"=="不能误写成 “=” !!

逻辑运算符

用于连接多个条件(一般来讲就是关系表达式),最终的结果也是一个 bool 值

1.png

1) &&也叫短路与如果第一个条件为 false,则第二个条件不会判断,最终结果为 **false **

  1. ||也叫短路或:如果第一个条件为 true,则第二个条件不会判断,最终结果为 true

赋值运算符

1.png

1.png

位运算符

位运算符这边涉及到计算机相关的知识,忘记的可以补习一下二、八、10、16进制以及原码、反码、补码相关的知识

相关链接:https://blog.csdn.net/asd1358355022/article/details/127898198?spm=1001.2014.3001.5501

1.png

其他运算符

1.png

特别说明(三元运算符)

image.png

1.png

运算符优先级

1.png

键盘输入语句

在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。

fmt 包的 fmt.Scanln() 或者 fmt.Scanf()

函数信息

1.png

1.png

代码示例

运行结果

程序流程控制

在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控制语句。分为:顺序控制、分支控制、循环控制。


顺序结构:代码从上往下依次执行

分支结构:根据不同的条件,执行不同的语句

循环结构: 根据指定的条件,重复执行某段代码。


顺序流程

程序从上到下逐行地执行,中间没有任何判断和跳转。

一个案例说明,必须下面的代码中,没有判断,也没有跳转.因此程序按照默认的流程执行,即顺序控制。

如下图所示,程序自上而下执行

image.png

执行流程图

1.png

分支控制

分支语句的作用就是满足判断条件进入代码块中执行相应的功能


if else流程控制

Golang 中规定与if匹配的{必须与if和表达式位于同一行,否则会发生编译错误。同样的,else也必须上一个分支的}位于同一行。表达式两边可以省略()。 分为单分支语句、双分支语句、多分支语句


switch case流程控制

除了if关键值,Golang 中还提供了switch语句对大量的值和表达式进行判断,除了支持数值常量,Golang 的 switch 还能对字符串、表达式等复杂情况进行处理。


switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上到下逐一测

试,直到匹配为止。


匹配项后面也不需要再加 break

**switch 和 if 的比较 **

总结了什么情况下使用 switch ,什么情况下使用 if


如果判断的具体数值不多,而且符合整数、浮点数、字符、字符串这几种类型。建议使用 **swtich **

语句,简洁高效。


其他情况:对区间判断和结果为 **bool **类型的判断,使用 if,if 的使用范围更广。

代码示例

运行结果

如下所示,每一种分支只会在满足条件进入到最先满足条件的分支里执行功能

循环控制

Golang 的循环体仅提供了for关键字,没有其他语言中提供的while或者do-while形式

语法格式

for 循环变量初始化; 循环条件; 循环变量迭代 {

循环操作(语句)

}

运行结果

跳转控制(break/continue/goto)

break:满足条件终止循环

continue:满足条件跳过此次循环进入下次循环

goto:跳转到指定的标签

Go 语言的 goto 语句可以无条件地转移到程序中指定的行。

goto 语句通常与条件语句配合使用。可用来实现条件转移,跳出循环体等功能。

在 Go 程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序

都产生困难


return:结束次方法或者代码块的运行(言外之意:到这里就可以了,不能继续往下走了)

运行结果

生成随机数

数组

和c语言相同,Go语言也提供了数组类型的数据结构,数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。

切片

slice 与 array 接近,但是在新的元素加入的时候可以增加长度。slice 总是指向底层的

一个 array。slice 是一个指向 array 的指针,这是其与 array 不同的地方;slice 是引用

类型,这意味着当赋值某个 slice 到另外一个变量,两个引用会指向同一个 array。例 引 用 类 型 使

如,如果一个函数需要一个 slice 参数,在其内对 slice 元素的修改也会体现在函数调 用 make 创建。

用者中,这和传递底层的 array 指针类似。通过:

sl := make([]in t , 10)

创建了一个保存有 10 个元素的 slice。需要注意的是底层的 array 并无不同。slice 总

是与一个固定长度的 array 成对出现。其影响 slice 的容量和长度。

运行结果

映射(map)

在 Go 中有 map 类型。map 可以认为是一个用字符串做索引的数

组(在其最简单的形式下)。

运行内容

函数

定义:为完成某一功能的程序指令(语句)的集合,称为函数。

格式

.0 关键字 func 用于定义一个函数;

.1 函数可以绑定到特定的类型上。这叫做 接收者。有接收者的函数被称作 method。 第 5 章将对其进行说明;

.2 funcname 是你函数的名字;

.3 int 类型的变量 q 作为输入参数。参数用 pass-by-value 方式传递,意味着它们会

被复制;

.4 变量 r 和 s 是这个函数的 命名返回值。在 Go 的函数中可以返回多个值。参阅

第 28 页的 “多值返回”。如果不想对返回的参数命名,只需要提供类型:(int,int)。

如果只有一个返回值,可以省略圆括号。如果函数是一个子过程,并且没有任何

返回值,也可以省略这些内容;

.5 这是函数体。注意 return 是一个语句,所以包裹参数的括号是可选的。


示例代码

运行结果: