go入门(二)

go编程语法(关键字):

1.const   声明常量,类比C++,php

2.var 定义全局变量,在函数内定义是局部变量,和js相同;    同理 Js,C,go中,全局变量是任何地方都可以被访问到。

3.type , 声明变量的数据类型,接口接口,结构体声明(这点类比C语言)

4.func ,定义一个函数。如 func  test(){}

别名 类比php 的 as关键字

const,type , var  也可以进行一组声明,非常方便的写法:

                                        

                                        

注意:go的整型是根据OS类型决定,如果系统是32位,int就是32,OS是64,int就是64,也可以直接决定整型的位数,如图中的int8,uint是无符号的整型。

                                           

go语言已经有很精确的float了,不需要double,这个是和很多语言不同地方。

                                      

复数类型能够保存无符号的整型指针。还有就是跟int一样,由平台决定复数类型的位数。

                     

像引用的话,默认值是null

math文件包里面有数据类型的常量 最大/小值,通常可以用来检查是否值有溢出。比如math.MaxInt32等。

 go同样也有多个变量一起定义/声明的方法:                                                        

 

同时,还有个语法糖 :

这对于写惯php的朋友非常友好。

   

感觉go非常棒啊,没有使用到的函数或者是变量或者是包,它都会提示你去掉这些多余的东西。

     

     

Go语言的指针和C语言的指针一样

                    

当使用:=这种形式赋值时候,一定要确保左边至少有一个是没声明的变量,并且注意要并行赋值,也就是注意变量个数,不要少赋值也不要多赋值。

go中要求所有声明的东西要被用上。

当一个函数返回多个返回值时,也可以用并行赋值;

golang函数:

                               

常量的枚举定义写法:

                              

自定义函数不能作用在常量上。

注意:go中的自增/减操作只能放在变量右边,并且不能像老牌语言用于赋值语句,比如要使用自增/减操作,就这能这样使用:

a++,仅此而已。

注意:go中当一个变量大于或者小于1,0时,老牌语言会判断出bool值,比如 a=1,  if(a) {}   ,而这种写法在go中不支持,go支持逻辑运算中的bool值。因为go中,0,1不是bool值,只有显示写true和false

循环:

                                  

                                                   

                                                                 

  用于对数组等数据类型的循环                                        

                                          

                                           

函数:

   

当有值要返回时就要定义对应的返回类型以及个数。

另外形参也要定义数据类型。两个或以上参数为同一数据类型时,定义的数据类型可以只写一次,就像定义同一类型局部变量的时候,但如果各个数据类型不同,就要分别写出来。如图:

                        

像前两种写法是等效的。

返回值列表也可以定义参数:func name ()(a,b,c int){}   也可以使用并行定义或者分开定义。

如果,返回值列表已经有定义的变量存在,那么该变量不需要重新声明定义,可在函数体内直接使用,如果使用“:“来声明定义,编译会报错

函数的不定长参数:                           

要注意的是,使用不定长要考虑清楚不定长参数的数据类型是否都是一致,并且使用了不定长,后面不允许再写参数,但是前面是还可以定义别的参数,比如:                                                                                                         

                                                             

slice切片是引用传递,当函数的传递直接是一个slice时,传入的是一个slice地址的拷贝,函数对切片的改变会影响到原本切片的内容。但是如果是可变参数的传值,虽然变参本质上就是一个slice,但是是属于值传递不是引用传递,只有直接将切片当成参数传递,才会产生引用传递。

函数要重点关注,有很多部分。https://www.cnblogs.com/hcy-fly/p/8182593.html

函数也是一个变量,如同JS那样赋值给变量使用。

匿名函数和JS的用法也一样。

闭包函数:

defer调用函数的写法,注意括号别漏了。

总结博客:https://www.jb51.net/article/92396.htm

golang的panic/recover异常机制实例:

注意下:

结构体:

                    简写初始化:

结构体也属于值传递。

推荐初始化方式:非常方便,传递时直接就是传引用。

匿名结构体:

匿名嵌套并初始化:

只有相同数据类型才可以进行比较,结构体的名称相同的情况下才可以比较,然后成员不同则不相等,成员相同则相等。

上图第一个红标的地方,(面向对象写法)是嵌套结构体(成员是结构体)的初始化,第二个红标是指,成员结构体的所有字段都可以当成是外层结构体的成员,因此可以直接用点运算符直接赋值运算。

匿名结构体的意思是定义好了结构体类型而没有结构体名,匿名字段是结构体成员中有数据类型而没有变量名称,两者不一样但是,匿名结构体可以写成匿名字段的形式。

防止结构体中重名问题:

如图:如果Name属性重名一定要写清楚是哪个结构体的字段。x.对应结构体.字段的形式。

go语言中,大写的变量(包括方法)是可以被外部使用的,相当于public,而小写相当于private。

强制类型转换实例:

                              

go语言递归和老牌语言一样,没什么好说的。

go语言的类型别名,type关键字,如果要使用这一功能,必须要考虑程序可读性。另外不建议使用已存在的关键字替换另一个已存在的关键字,也就是改数据类型。

                                                                     

                                                

                                                

                                          

和php,js不一样,go语言像C,会将数字转换成ASCI码对应的文本字母。

也可以将数字转换为字符串,但要使用一个strconv包,strconv.Itoa,同样字符串转换成数字为,strconv.Atoi.

补充:常量的赋值不能使用变量来赋值,如果右边出现了含有变量的赋值表达式,编译不通过。

                                     

并且要想使用枚举,必须显示赋值iota,(特别是第一行开始的时候,如果是第一行开始就想使用枚举,那么第一行就要开始使用iota赋值);当常量被赋予别的值的时候,枚举类型会失效,不会继续自动赋值iota,除非当某一行作为起始重新执行iota,下一行开始就继续自动枚举。

常量由于规定是大写,所以要设置为私有的话,可以前面加个小写字母前缀或者以下划线做个前缀。

                                    

                                   

                                   

如果在if,for,switch等块级语句定义的变量,当程序执行完后,变量将不复存在,因此该变量的作用域是在该块级作用域内。还有要注意的是go语言的左括号{,必须要跟在if,for的语句同行。

PS:在循环块级语句内定义的变量,每次循环定义时变量地址都是改变的,也就是说也就只有在块级语句内,同一个变量名才能允许反复声明定义。

块级语句可以支持并行初始化定义:

                                                             

                               

                               

golang还支持条件的继续执行:

                                                  

如果上个case成功执行,老牌语言是直接退出了,但go直接加关键字fallthrough,可以继续执行到下一条分支case,即可执行分支+1。

                                

                                                                   

break+标签   :  这段程序,如果不要标签,那么大层的for循环会无限循环,但加上了标签,意思就是当前标签下的循环即大循环退出,这时整个循环结束。这样的作用使得程序无论多少个大循环都可以结束。

continue+标签:会跳出当前循环程序,重新循环最外层。

goto+标签:从标签的位置起执行程序。

go数组:

                                  

注意:即使都是int的数组,长度不同也不属于同类型数组。只有类型相等的情况下,数组可以互相赋值。

数组也有简写形式,像C语言或者php赋值那样:  a:=[len]int{填入元素值}

也可以直接让某个数组下标直接赋值,比如让第八个下标赋值为1:b:=[len]int{7:1},多重指定下标赋值: 

b:=[len]int{7:1,8:2,9:2}等等

也可以像老牌语言的操作:

                                

还可以使用三个点,省略数组长度,不需要长度指定比如:   b:=[...]int{1,1,3,4,5},如果不指定长度,go会计算你指定的最大索引值(就是你设置的最大数组下标),以这个索引值做为长度。

数组在go中,在函数传参中,是值传递不会是引用传递,和C不同。

数组比较的时候,只有当数组类型相同时候才可以进行比较

指针数组和数组指针:

一句话总结:注意*与谁结合,如p *[5]int,*与数组结合说明是数组的指针;如p [5]*int,*与int结合,说明这个数组都是int类型的指针,是指针数组。

数组的指针意思就是一个指针,它指向一个数组所在的内存空间,而指针数组,是每一个元素存储的都是一个地址,数组多长就存储了len个地址。

多维数组:               ,在一维数组使用的设置,在二维数组同样适用,但是二维数组只有第一维可以省略长度,第二维度以及以后都不可以省略长度:

数组如果要省略(第一)维度,会有个坑:这里,如果你将第一维度用三个点代替,编译是错误的,因为第一维度的长度无法根据下面的索引赋值进行计算。但是写在这对初始化的{ }里就可以自动计算,一维数组也是有这个坑存在:

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值