从零开始学go(一)
一、go的简单介绍和安装
首先本人重新开坑 ,
1.1 介绍
go总体来讲就是将c和java的特性给结合和优化所诞生出来的,由Rob Pike(罗伯.派克),Ken Thompson(肯.汤普森)和Robert Griesemer(罗伯特.格利茨默)三位大佬所创造出来的,拥有比较简洁的语法和很好的性能,同时也是编译性语言,而go主要用于web或者游戏服务器,简单来说就是后台,也就是为什么越来越多的公司选择后端都会使用go,而不是繁琐的java。
1.2 安装
安装的sdk实际上直接看官网即可,这里就将安装在windows上。
Windows 下载的是 .msi 后缀,默认情况下 .msi 文件会安装在 c:\Go 目录下。你可以去自定义,但是要将go目录添加倒环境变量中,也就是系统变量中的Path路径。安装完成以后,在cmd中输入go version,如果有显示版本证明安装成功。
1.3 使用vscode安装go插件
如果你没有梯子的话安装go的扩展是会非常慢的,这点请注意。
1.4 编写hello world
安装完以后看默认文档中的bin是否有这些文件,有就没问题,然后在vscode中的工作文件夹中创建一个名为main.go的文件,写下hello world
1 | package main |
然后在vscode的终端中输入go run ./main.go
即可编译成功,如图
二、数据类型介绍
跟很多语言的数据类型一样,都会int float string 等众多数据类型,如
int unint byte float32 float64 等等,其中int有负数,unint无负数
浮点数代码项目中的小数,零值是一个变量的默认值
2.1 变量
接下来,将用代码来解释数字类型
1 | //整数i int类型 |
类型实际上是有默认值,如
1 | var i int //i的值为0 |
而如果我们要声明一个变量,实际上还可以进行简化
1 | e := 10 //int |
2.2 常量
定义一个常量很简单,只需要关键词const即可,但常量一旦定义则不可修改
1 | //常量 |
2.3 类型转换
类型转换实际上是用的strconv这个包,关于里面的api这里就不必多少了这里就简单的说明一些,代码所示
1 | //Itoa int类型转为string类型 |
2.4 strings包
strings包也是go官方的api库,跟java中的string包也是类似,这里就写几个api,如下代码所示
1 | s1 := "abcdefgh" |
三、条件语句
3.1 if条件语句
首先要说明的是if后面的表达式不需要(),这跟很多语言不同,比如说java,每个条件分支大括号是必须的,if紧跟大括号,{不能占一行,else同理,在if…else条件语句中可以增加多个else if…else
1 | //if语句 |
if语句也可以进行简化,将定义变量合并起来
1 | if i := 6; i > 10 { |
3.2 switch语句
当if条件过多时,就可以用switch语句来替代。switch的case从上到下逐一进行判断。
一旦满足条件,立即执行对应的分支并返回,其余分支不再做判断
1 | switch i := 6; { |
3.3 for循环语句
简单语句,一般用于for循环的初始化。for循环的条件,表示for循环什么时候结束。
更新语句,一般用于更新循环的变量
1 | sum := 0 |
由于go没有while语句,所以只能用for来模仿一个
1 | sum1 := 0 |
也跟其他语言一样,有着break和continue。continue可以跳出本次循环,继续执行下一个循环
break可以跳出整个for循环,哪怕for循环没有执行完,也会强制终止。
1 | //break |
四、数组
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。
4.1 数组的简单定义
1 | array := [5]string{"a", "b", "c", "d", "e"} |
也可以用…来省略
1 | array1 := [...]string{"a", "b", "c", "d", "e"} |
如果要初始化索引则不可用…来进行省略
1 | array2 := [5]string{1: "b", 3: "d"} |
数组也可以用for循环来进行表示
1 | for i := 0; i < 5; i++ { |
但大部分情况下使用的是for range这种Go语言的新型循环
1 | for i, v := range array { |
如果不需要索引值,可以使用_将索引丢弃
1 | for _, v := range array { |
4.2 二维数组
1 | func main() { |
4.3 byte的一些使用
UTF8编码下,一个汉字对应三个字节,所以字符串s的长度其实是12
1 | s1 := "hello 世界" |
五、切片
切片和数组类似,可以把它理解为动态数组,对数组任意分隔,就可以得到一个切片。基于数组生成切片,包含索引start,但是不包含索引end,切片和数组一样,也可以通过索引定位元素
1 | array3 := [5]string{"a", "b", "c", "d", "e"} |
1 | //修改切片 |
这里的len函数是指slice的长度,而cap函数指的是整个数组的长度
1 | slice1 := []string{"a", "b", "c", "d", "e"} |
append的简单使用
1 | //追加一个元素 |
六、map结构
6.1 声明map和使用
map是一一个无序的K-V键值对集合,结构为map[K]V,其中K对应Key,V对应Value
map的门操作符可以返回两个值
1.第一个值是对应的Value
2.第二个值标记该Key是否存在,如果存在,它的值为true
添加键值对或者更新对应Key的Value
nameAgeMap[“世界”] = 20
获取指定Key对应的Value
age := nameAgeMapr[“世界”]
1 | //声明 |
6.2 遍历Map
对于map,for range返回两个值
1.第一个是map的Key
2.第二个是map的Value
1 | nameAgeMap["世界"] = 20 |
七、函数
通过函数,可以把开发任务分解成一个个小的单元,这些小单元可以被其他单元复用,进而提高开发效率、降低代码重合度任何一个函数的定义,都有一个func关键字main是函数的名字main函数名字后面的一对括号0是不能省略的括号里可以定义函数使用的参数
函数的声明格式
1 | func funcName(params) result { |
关键字func
函数名字funcName
函数的参数params,用来定义形参的变量名和类型
result是返回的函数值,用于定义返回值的类型
1 | func sum(a, b int) int { |
Go语言的函数可以返回多个值,也就是多值返回
第一个值返回函数的结果,第二个值返回函数出错的信息
不管是自定义的函数sum、sum1,还是我们使用到的函数Printin,都会从属于一个包也就是package,不同包的函数要被调用,那么函数的作用域必须是公有的,也就是函数名称的首字母要大写
函数名称首字母小写代表私有函数,只有在同一个包中才可以被调用
函数名称首字母大写代表公有函数,不同的包也可以调用
任何一个函数都会从属于一个包
1 | func sum1(a, b int) (int, error) { |
方法必须要有一个接收者,这个接收者是一个类型,这样方法就和这个类型绑定在一起,称为这个类型的方法,接收者的定义和普通变量、函数参数等一样
前面是变量名,后面是接收者类型
在函数中再定义函数(函数嵌套),定义的这个匿名函数,也可以称为内部函数更重要的是,在函数内定义的内部函数,可以使用外部函数的变量等,这种方式也称为闭包
1 | type Age uint |
八、总结
本期我们讲了安装使用、数据类型、条件语句、数组、切片、Map和函数。如果有代码基础,实际上这些只需要一个小时即可掌握。
如果硬要难的话可能是函数中的闭包没有见过,这里需要着重看一下。