Go语言基础语法 | 青训营笔记

32 阅读13分钟

这是我参与 [第五届青训营] 伴学笔记创作活动的第1天!

前言

今天学习了青训营的课程,学习了Go语言的基础,相比于其他语言,具有高性能高并发的特性,且支持跨平台,有自己的垃圾回收机制,不需要自己手动的去管理。接下来对本节课的内容进行讲解。

一、Go语言形式

作为程序员首先要贴出来的代码自然是Hello World!

helleoWorld.png

  • 第1行表示任何一个go文件都是以package开始,后面是main表示该文件属于main包下的。
  • 第3行表示导入的文件所需的包,fmt用于格式化输出、接收输入。如第6行的Println函数输出。Go的标准库提供了100多个包,根据文件的需求,用import导入。
  • 第5行表示具体函数,main是函数名。
  • 第6行是具体的函数体。

二、基础语法-变量和常量

1、变量声明

可以通过var声明语句创建一个特定类型的变量,创建规则如下:

var 变量名 类型 = 表达式

申明变量的时候,类型= 表达式可以省略一个,如下图所示:

变量01.png

  • 第5行是完整的变量申明,为int类型的1,也可以像第5行一样同时定义多个变量。
  • 第6行则是省略了类型,根据后面的赋值自动推导前面的变量类型为字符串类型。
  • 如果省略了= 表达式,如第7行所示,会用零值初始化该变量为0,数值类型的零值是0,布尔类型的是false,字符串类型的是空串,接口或者应用类型的是nil

2、简短变量申明

简短变量申明的表达式为:

变量名 := 表达式

具体例子如下图所示:

变量02.png

省略类型,可以根据后面参数推导变量类型,同时后面可以接具体数值,也可以接一个表达式,如第7行所示。

3、常量声明

常量申明用const,语法规则和常量一样,如下图所示,分别申明了字符串类型和int类型的常量

常量3.png

三、基础语法-if else

Go语言的if else语法如下图所示:

ifelse.png

具体的分支语句是第7和第9行,Go语言的分支语句与其他语句不同的是,在if后面的条件不用加括号,可以直接写。

四、基础语法-循环

Go语言中的几种循环如下图所示:

循环.png

  • 第一种循环如第4行所示,只有for没有循环条件,表示死循环,如同其它语言中的while(true),可用break跳出循环。
  • 第二种循环如第9行所示,只有小于的上限条件,但是需要自己实现初始值赋值,以及自增的操作。
  • 第三种则是第二种的完整实现,在for循环后面加上了循环条件,同样不需要用括号。在循环里面,可以通过break跳出循环,也可以用continue放弃本次循环,进入下一次循环。

五、基础语法-switch

switch语法如下图所示,Go语言中switch条件语句比较强大,可以是任意的类型,包括数字,字符,甚至是字符串、结构体,然后与case后面的语句进行比较判断,执行相应的语句。与其他语言不同的是,Go语言中switch的条件不用加括号,case后面语句执行完毕后,不需要加break就可以跳出来。不会像其他语言一样,没有break就会跑完所有case分支。

image.png

六、基础语法-数组

数组的定义格式如下:

var 数组名 [元素个数]类型

对应的程序如下:

image.png

第4行则是对数组的创建,需要指定元素个数,以及类型。可以通过数组的索引对数组元素进行操作,如第5、6行分别进行写、读操作。

七、基础语法-切片(slice)

由于数组的长度是固定的,所以不方便对其进行扩容和缩减,所以在应用上更多的还是使用切片,它可以任意的更改长度,使用更加方便。 切片的创建方式如下,同时还有切片的多种使用方法。

切片名 := make([]类型,长度)
切片名 :=[]类型{"a","b","c"}

image.png

  • 创建切片方式如第4、5行所示,分别用两种不同的方式创建。
  • 切片也同数组一样,可以通过索引对相应位置进行读写操作,如第6行所示。
  • 可以使用len()函数对切片求长度,如第7行所示。
  • 切片还支持追加的操作,采用append()函数,传入的参数第一个是要追加的切片,第二个是要追加的数据,同时还要将结果返回原切片。扩容时候会创建新的切片,所以要每次都返回。
  • 可以通过数组范围来获取切片的部分元素,如第11行所示,但是该范围返回的是一个左闭右开的区间,不包括最右端的数据。若只有:前的数据,默认右端是切片的最后一个;若只有:后面的数据,默认左端是切片的开头。

八、基础语法-map

map是以key-value形式存储的,创建方式如下所示:

名 := make(map[key类型]value类型)
名 := map[key类型]value类型{key1:value1,key2:value2}

image.png

map的语法如上图所示,通过两种形式创建后,可以用len()查看map的大小,同时可以对其进行增删改查的操作。
  • 增:可以通过key-value对来向map里面添加数值,如第8行所示。
  • 改:可以用key做索引,在map里面找到对应的值,然后赋给新的value,如第9行所示。
  • 查:同样可以用key做索引进行查找,返回的就是对应的value值,如第10行所示。
  • 删:删除map中的元素,需要调用delete()函数,对应的有两个参数,第一个是要删除元素的map,第二个是要删除的元素key值,如第11行所示。

而且在查找元素的时候,可以返回两个参数,第一个是对应的value值,第二个是布尔值表示查找是否成功,如果找到了就返回对应的value和true,没找到就返回0和false。

九、基础语法-range

通过range可以快速的实现对数组或者map的遍历,程序如下:

image.png

  • 对数组的遍历如第7-8行所示,在for后面直接用range 数组名来遍历,返回值是对应元素的下标和元素值,即图中的i和num,在循环体里面可以对返回的数据进行操作。如果不需要返回的索引,可以在返回的第一个元素处用下划线替代。
  • 对map的遍历如第11-13行所示,同样遍历map的时候也是在for后面直接用range map名来遍历,返回的是对应key和value值,如果在返回值中只需要key的话,可以在返回值的位置处致谢一个参数k。

十、基础语法-函数

image.png

函数的表达式如上图所示,func表示这是一个函数,add表示函数名,随后的括号里表示这个函数需要的参数,均已参数和类型的表示方法表示,接着后面的int表示这个函数返回值的类型,如果没有返回值直接不写。第一个函数表示的只有一个返回值,其实Go语言中支持返回多个参数,比如第二个函数exists对map操作,返回两个值,第一个是查找的"a"的value值,第二个是返回的状态信息或者是错误信息。

十一、基础语法-指针

image.png

上图中给出了两个不同的函数,区别是传入参数不同,add1传入的是普通参数,add2传入的是指针,Go中的指针相比于C/C++的指针功能作用更小,支持的操作很有限。主要用途就是对函数传入的参数进行修改。add1函数里做自家后,数值还是不变,因为这里是对拷贝的数据做的操作。add2函数里传入的是a参数的指针,第9行也是对指针指向的位置数据做自加操作,是可以成功的。但是在main函数中调用add2的时候传入的参数前面要加一个&符号,如add2(&a)

十二、基础语法-结构体

1、结构体定义

Go语言中的结构体是一些带有类型字段的集合,相当于其他语言中的对象,结构体中的字段就是对象的属性,可以通过多种方式对结构体进行初始化,如下图所示: image.png

初始化的时候,可以直接在{}内以键值对的方式申明所有的字段,如第8行所示。也可以指初始化部分参数,然后可用结构对象调用其字段赋值,如第11、12行所示。同样也可以先申明一个没有初始值的结构体,然后调用里面的字段赋值,如果初始化的时候,没有给初始值,那么对应的数字类型就是0,字符串类型就是空。

注:结构体也可以作为参数传入到函数里,同样有两种方式,第一种是直接传结构体,操作的时候是对拷贝进行操作的;第二种是传入指针,操作的时候是对原结构体操作,这样就避免了大结构体的拷贝开销。

2、结构体方法

结构体方法就是针对结构体里面字段进行操作的方法,可以通过初始化后的结构体调用这些方法,类似于其他语言中的类成员方法,可以通过类的实例对象调用,具体代码如下:

image.png

resetName函数则是对结构体中name字段进行修改,与普通的函数不同的是,普通函数是把结构体对象放函数名后面的参数列表中传进去的,而结构体函数直接把结构体对象放在函数名前面。可以通过结构体对象调用对应的结构体函数操作对应变量,如第12行所示。

注:同样结构体方法在传参的时候,也有普通传递和指针传递两种形式。

十三、基础语法-错误处理

Go中处理异常是用一个单独的返回值来接收错误,可以清晰的看到是哪个函数出现了错误,如果没有错误,则会返回nil,具体代码如下:

image.png

如上图程序所示,定义了一个函数用来查找数组中是否有对应的user,函数的返回值里面多了一个error类型的参数用来接收错误。如果没有错误,则返回nil,如第16行,如果有错误则需要通过New()函数创建一个,如第19行。同样在main函数中调用的时候,也要用两个返回值接收,并对错误做判断,才能进行下面的执行。

十四、基础语法-字符串操作

在GO语言中也可以对字符串进行操作,具体操作如下图所示:

image.png

从上到下分别表示:是否包含对应字符串;统计对应字符串个数;是否以对应字符串为前缀;是否以对应字符串为后缀;对应字符串的起始索引;以给定连接符连接多个字符串;重复字符串;替换指定字符;以给定的分隔符分割字符串;把字符串全全变成小写;把字符串全变成大写;获取字符串的长度。

十五、基础语法-字符串格式化

Go语言中也有多种格式化的函数,如下图所示:

image.png

通过Println()函数可以打印一个或者多个。用Printf()打印的时候,可以用%v来代替所有参数,不需要像别的语言那样,不同的类型用不同的格式代替,中间加了不同的符号表示打印的详细程度,什么都没有表示只打印数据,加了+表示打印结构体字段名,加了#表示打印更详细信息,包括所属函数名、结构体名、字段名。同时还可以用%.2f表示保留2位小数。

十六、基础语法-json

结构体和json字符串之间的转换如下图所示:

image.png

要进行json序列化时候,要保证结构体里面每个字段名的首字母大写,然后可以通过调用json的Marshal()方法进行序列化,返回的结果是一个byte数组,打印的时候如果直接打印是十六进制的数组,如19行注释。在数组外用string()转换后打印出来的就是字符串格式了。同样可以申请一个空的userInfo,然后调用json的Unmarshal()方法反序列化成改结构体。

十七、基础语法-时间处理

Go语言中对时间的处理如下图所示:

image.png

  • 通过Now()函数可以获取当前时间,得到的时间包含了时区等更多的详细信息。
  • 可以通过Date()函数设置指定的时间。
  • 可以通过时间对象调用Year()Month()Day()Hour()Minute()Second()函数分别获取时间中的年、月、日、时、分、秒信息。
  • 可以通过Format()函数将时间变成指定的格式,参数里面的时间是time包的官方文档规定的。
  • 可以通过Sub()函数获取两个时间的差,结果以时、分、秒形式返回。
  • 可以通过Minutes()Seconds()函数获取这个时间区间内有多少分钟,多少秒。
  • 可以通过Parse()函数将第二个参数处的字符串解析成第一个参数格式的时间。
  • 可以通过Unix()函数获取当前时间的时间戳。

十八、基础语法-数字解析

在Go语言中,可以对字符串类型的数字进行转换,转换的函数都在strconv包里面,具体代码如下:

image.png

  • 可以通过ParseFloat()函数,把浮点数类型的字符串转成数字,第二个参数64表示以64位来存储。
  • 可以通过ParseInt()函数对整型的数字字符串进行转换成数字,第二个参数表示进制,10则表示以十进制转换,0则表示自动推测这个数据的进制,第三个参数表示精度。
  • 也可以用Atoi()函数快速的进行转换。

结束语

以上即为今天的Go语言基础语法的内容,刚刚初学go,难免有错漏之处,如有发现,欢迎指正。