前言:因为要决定走后台这条路了,加上现在go语言也挺火的,非常适合后台这个方向,所以本人也打算学习一下传说中的go语言。写这篇博客的目的是记录一下自己的学习过程,也方便后面回顾,如果能帮到正在入门go语言的人,那我也非常开心。话不多说,进入正题。首先go语言的环境是非常好配置的,都是傻瓜式配置,关于代码编辑器,我本人使用的IDEA+go插件。喜欢哪种就用哪种并没有太多的区别。
1.定义变量
关于go语言的语法,从定义变量说起。与我们之前遇到过的其它语言定义变量的过程不同,go语言是和它们相反的,go语言定义变量规则如下:var 关键字 + 变量名(可以多个变量)+类型。如var a int var s string。需要注意的是go语言定义变量的时候有初值。int类型是0,string类型是空。这是其中的一种,你可以不加变量的类型,因为编译器会根据你给的值自动识别。还有一种变量的定义是不加var关键字,如s:=4,这种只能用于函数内部。另外一种是集中定义,如var(变量1,变量2......变量n)。
2.内建变量
学习任何一门编程语言前必须要了解它的变量类型。go语言并没有像C++那么花里胡哨的东西,什么long long int ,short之类的,go语言很简单粗暴,如下:(u)int8,(u)int16,(u)int32,(u)int64,uinprt(指针,稍后介绍),括号里面的u代表unsigned,数字8表示位数。另外go语言有string但没有char,取代char的是rune,它是32位4字节的。至于为什么要用rune取代char并且是32位,自行谷歌之。其它变量类型还有:byte、float32、float64、bool。go语言没有double类型也没有枚举类型,因为它没有枚举关键字。但它提供了实现枚举的方法,const+iota。稍后介绍。go语言同时也提供了强制转换,但是只有显示转换,并没有隐式转换。所谓显示转换必须得自己手动转换,常以构造函数的形式,而隐式转换是编译器帮你完成的。看下面的代码:
var a,b int = 3,4
var c int
c = int(math.Sqrt(float (a*a,b*b)))
为什么要加float呢,查阅API文档可知go语言的sqrt函数是参数要求是两个float,因此这里要强制转换一下。同理也是sqrt的输出结果也是float,而c是int类型的,所以也要转换一下。
3.常量与枚举
go语言的常量和C++一样也是用const关键字修饰。定义方法如下:const + name +类型。如果没有类型修饰的时候,那么const 定义的变量可以作为各个类型来使用。比如const a = 5;即可作为int类型的5使用,也可以当成string类型的5来使用。下面说一下如何用const来实现枚举。其实很简单,就是集中定义,如下:
const(
cpp=0 (cpp =iota)
java=1
python=2
)或者你可以将cpp的值替换为iota,表示它是递增的。iota是go语言提供的一个递增值,从0开始。用fmt.Println()打印查看。发现两次输出都是0 1 2 。
4.if条件分支
go语言的if条件分支与其它语言的形式差不多,都 if else,区别就在于go语言的if是没有括号的并且可以带复杂的参数,比如 if s:=function(),s!=0 这种复杂的形式。对了,go没有null关键字,替代null的是nil。
5.循环分支
go语言只有for循环一种,并没有while,因为go语言提供了for的死循环形式(for {})后觉得没有必要再用while了。for循环也同样没有括号,其形式和c++语言差不多,循环起始条件、迭代形式、终止条件。三种都可以省略某个或者全部条件省略(死循环)。
6.定义函数
go语言定义函数的方式比较简单,func关键字+函数名+返回值类型,无返回值的时候可以不要返回值类型。另外函数的参数也比较多样,可以可变参数列表,如(func sum(numbers...int),三个点代表参数个数不确定)。函数的参数也可以是函数,结合具体功能来使用。
7.指针
说到指针肯定是很多人的噩梦吧,C++语言的指针有值传递和引用传递两种方式,引用是比较复杂的,但放心,go语言的指针只有值传递一种方式。如何理解值传递呢,顾名思义就是拷贝你要使用的那个变量的值传给待使用的对象。另外go语言的指针并不能像C++的指针那样参与运算,因为它只有值传递。具体可以结合swap函数来理解,如果你以值传递的方式交换ab的值是交换不成功的,要直接对地址进行交换。(如果非要值传递交换,利用go语言函数可以返回多个参数的特点,传进来ab,return b,a即可)