GoLang语言学习
一、为什么要学习GoLang
入职新公司后,公司主流技术栈就是GoLang. 算是 Have To
相比于其他语言优势在哪里?
并发性好,Goroutine 和 channel 使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个 Go 应用也能有效的利用多个 CPU 核,并行执行的性能好
部署简单,Go可编译生成一个静态可执行文件,除了glibc没有其他依赖
良好的语言设计,规范语法简单灵活
二、环境准备
下载golang 安装包
https://golang.org/pkg/
配置环境变量
GOPATH之下包含了三个目录:bin、pkg、src
bin目录主要存放了可执行文件;
pkg存放编译好的库文件,主要是*.a的文件;
src目录下主要存放go的源文件
配置GOROOT,就是go的安装路径
配置GOPATH,是作为编译后二进制的存放目的地和import包时的搜索路径 (其实也是你的工作目录, 你可以在src下创建你自己的go源文件, 然后开始工作)
安装包管理工具glide
glide官方网址:glide
安装glide工具
创建glide.yaml文件
更新依赖
安装依赖
其他用法和语法说明https://glide.readthedocs.io/en/latest/
IDE
liteide
Goland
三、第一个Hello Word
执行代码
四、语言结构
语言结构
包声明
包引入
函数
变量
语句&表达式
注释
五、语言基础语法
行分隔符
在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。
注释
标识符 可以是数字,字幕,下划线组成,不能以数字开始
关键字
Go 语言的空格
Go 语言中变量的声明必须使用空格隔开,如:
六、Go 语言数据类型
数字类型
浮点数
其他数字类型
七、Go 语言变量
语言变量
Go 语言变量名由字母、数字、下划线组成,其中首个字母不能为数字
第一种,指定变量类型,声明后若不赋值,使用默认值。
第二种,根据值自行判定变量类型。
第三种,省略var, 注意 :=左侧的变量不应该是已经声明过的,否则会导致编译错误。
变量声明
多变量声明
值类型&引用类型
所有像 int、float、bool 和 string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值, 当使用等号 = 将一个变量的值赋值给另一个变量时,如:j = i,实际上是在内存中将 i 的值进行了拷贝。 你可以通过 &i 来获取变量 i 的内存地址,例如:0xf840000040(每次的地址都可能不一样)。值类型的变量的值存储在栈中。 内存地址会根据机器的不同而有所不同,甚至相同的程序在不同的机器上执行后也会有不同的内存地址。因为每台机器可能有不同的存储器布局,并且位置分配也可能不同。 更复杂的数据通常会需要使用多个字,这些数据一般使用引用类型保存。 一个引用类型的变量 r1 存储的是 r1 的值所在的内存地址(数字),或内存地址中第一个字所在的位置。
赋值操作
使用 := 赋值操作符
八、Go 语言常量
Go 语言常量
常量是一个简单值的标识符,在程序运行时,不会被修改的量。 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。 常量的定义格式:
iota常量
iota,特殊常量,可以认为是一个可以被编译器修改的常量。 在每一个const关键字出现时,被重置为0,然后再下一个const出现之前,每出现一次iota,其所代表的数字会自动增加1。 iota 可以被用作枚举值:
用法
九、Go 语言运算符
内置的运算符
算数运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
其他运算符
算数运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
其他运算符
运算符优先级
十、Go 条件语句
Go 语言提供几种条件判断语句
if 语句
if else 语句
if 嵌套语句
switch 语句
select 语句
select是Go中的一个控制结构,类似于用于通信的switch语句。每个case必须是一个通信操作,要么是发送要么是接收。
select随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。一个默认的子句应该总是可运行的。
Go 编程语言中 select 语句的语法如下:
十一、语言循环语句
for 循环
Go语言的For循环有3中形式,只有其中的一种使用分号。
和 C 语言的 for 一样:
和 C 的 while 一样:
和 C 的 for(;;) 一样:
代码示例:
嵌套循环
以下为 Go 语言嵌套循环的格式:
循环控制语句
break语句
经常用于中断当前 for 循环或跳出 switch 语句
continue 语句
跳过当前循环的剩余语句,然后继续进行下一轮循环。
goto 语句
将控制转移到被标记的语句。
十二、语言函数
函数是基本的代码块,用于执行一个任务。
Go 语言最少有个 main() 函数。
你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。
函数声明告诉了编译器函数的名称,返回类型,和参数。
Go 语言标准库提供了多种可动用的内置的函数。例如,len() 函数可以接受不同类型参数并返回该类型的长度。如果我们传入的是字符串则返回字符串的长度,如果传入的是数字,则返回数组中包含的函数个数。
函数定义
示例
函数作用域
函数名称首字母大写对于外部可见,首字母小写对于本包可见。
函数初始化顺序问题
所以golang默认会初始化const变量,var定义全局变量,init函数
函数参数
函数如果使用参数,该变量可称为函数的形参。
形参就像定义在函数体内的局部变量。
调用函数,可以通过两种方式来传递参数:
值传递
默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。
引用传递
引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。 引用传递指针参数传递到函数内,以下是交换函数 swap() 使用了引用传递:
函数用法
函数作为值
函数闭包
Go 语言支持匿名函数,可作为闭包。匿名函数是一个"内联"语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量,不必申明。
十三 语言变量作用域
作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。
Go 语言中变量可以在三个地方声明:
函数内定义的变量称为局部变量
函数外定义的变量称为全局变量
函数定义中的变量称为形式参数
局部变量
全局变量
形式参数
形式参数会作为函数的局部变量来使用。实例如下:
默认值问题
十三 Go 语言数组
Go 语言提供了数组类型的数据结构。
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。
相对于去声明number0, number1, ..., and number99的变量,使用数组形式numbers[0], numbers[1] ..., numbers[99]更加方便且易于扩展。
数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为 0,第二个索引为 1,以此类推。
声明数组
初始化数组
访问数组元素
数组元素可以通过索引(位置)来读取。格式为数组名后加中括号,中括号中为索引的值
示例
多维数组
初始化二维数组
访问二维数组
十四Go 语言指针
Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务。
接下来让我们来一步步学习 Go 语言指针。
我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地址。
Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。
什么是指针
一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址,和C C++概念一样。
如何使用指针
定义指针变量。
为指针变量赋值。
访问指针变量中指向地址的值。
空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。nil 指针也称为空指针。
其他示例
十五 Go 语言结构体
Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。和C语言struct很像。
定义结构体
访问结构体成员
结构体作为函数参数
结构体指针
十六Go 语言切片(Slice)
Go语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
切片
len() 和 cap() 函数
切片是可索引的,并且可以由 len() 方法获取长度。 切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。
空(nil)切片
一个切片在未初始化之前默认为 nil,长度为 0
切片截取
可以通过设置下限及上限来设置截取切片 [lower-bound:upper-bound]
十七 范围(Range)
Go 语言中 range 关键字用于for循环中迭代数组(array)、切片(slice)、链表(channel)或集合(map)的元素。在数组和切片中它返回元素的索引值,在集合中返回 key-value 对的 key 值
十八 Go 语言Map(集合)
Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的
定义 Map
delete() 函数
十九递归函数
二十 语言类型转换
类型转换用于将一种数据类型的变量转换为另外一种类型的变量。Go 语言类型转换基本格式如下
二十一 Go 语言接口
Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口
二十二 错误处理
Go 语言通过内置的错误接口提供了非常简单的错误处理机制。
error类型是一个接口类型
我们可以在编码中通过实现 error 接口类型来生成错误信息。
函数通常在最后的返回值中返回错误信息。使用errors.New 可返回一个错误信息
部分内容来源于网络,如有侵权,本作者可立即删除!
如果喜欢请关注一下
领取专属 10元无门槛券
私享最新 技术干货