读书人

go语言学习总结(一)

发布时间: 2013-03-01 18:33:02 作者: rapoo

go语言学习小结(一)
学习go。记录下
1),package、import
? ? 这两个功能在现在的很多语言(java、C#)都具备了。这里面引入包在C家族确实是个很好的东西,使得代码组织更清晰;import而不是include头文件,完全剔除了c家族的弊病。

2),变量命名风格的改变
? ?定义变量:
? ? ??var i int跟C家族语法int i;相去甚远,貌似更接近delphi、javascript、scala风格。当然在语法分析中这样定义变量比C风格的定义是更容易识别的。

? ??类型推导:
? ? ??类型推导在很多函数语言(scala、f#等)是必须滴,当然C#为了推出lambda表达式也实现了这个功能,不过java现在还没有。需要注意的是go中类型推导只能用在函数里面。来看看?var i int=11的等价写法 ?i := 11。

? ?同时给多个变量赋值:
? ? ??lua可以给多个变量赋值的,go也有而且语法几乎一样滴?a,b,c?:= 1,2,3 ,如果写成 a,_:=1,2 那么2就自动丢掉。
? ? ??有了这个功能交换变量一句话就搞定了 a,b =b,a。?

? 定义多个变量:
? ? ??如果是定义相同类型的变量可以这样 var i,j int? 跟C差不多 int i,j;
? ? ??如果是多个不同类型的变量那是这样
? ? ??var (
????????????? ? i int
????????????? ? s string
????????)

? 定义数组:?
? ? ? 定义数组跟定义变量稍微变一变?var array?[8]int
? ? ? 还可以这样写?array :=[...]int{0,1,2,3,4,5,6,7}。
? ? ? 获取数组长度 len(array),而不是C家族的array.length
?
3),go内置数据类型
? slices:
? ? ? 上面定义的数组大小是无法改变的。如果要动态的那就要这样?array :=make([]int,8) 或者这样是
???????var array []int???????array =make([]int,8)

? ? ? ??[n:m]访问符
????????? ? [n:m]同样也适用于数组的。用array[n:m](n、m是数组下标)将返回一个从n到m-1的slices。
????????? ? 如果写成[n:]则等价于[n:len(array)]
?????????? ??array :=[...]int{0,1,2,3,4,5,6,7}
????????? ? ?array2 :=array[2:4]? ? //返回{2,3}
??????????????
????? ??cap函数
? ? ? ???????cap 用于获取数组的容量。
?
????? ?append函数
?????????????在一个slices或数组后追加元素,产生一个新slices。
?????????????array :=?[...]int{0,1,2,3,4,5,6,7}。
????????? ? ?array1 :=?array=append(array,8,9,10);//添加的数据(8、9、10)是一个可变参数

?????? ?copy函数
????????? ?n?= copy(des?,src)。n等于拷贝元素个数。
? ? ? ? ? ?array :=?[...]int{0,1,2,3,4,5,6,7}。
????????? ?array1 :=?make( []int,5)
????????? ?copy(array1,array[0:5])
? ? ??
??map?:
? ? ??go中内置了map数据结构。定义一个map是这样的 var m map[kType]vType。vType是map关键字存储的值的类型,kType是关键字的数据类型。map的创建也是需要用make函数来创建的 m=make(map[int]string) ,这里创建关键字类型为string,值类型为int的map。如果map的值是知道的,那么可以用这样? ? ??m:=map[int]String{
? ? ?? ? ?????1:"A",
???????????????2:"B",
???????????????3:"C",
????????????????...? ? ??}?
? ? ? 注意map里每个元素逗号后一定要换行。
? ? ??map增加元素 m[4]="d"?;
? ? ??map去除元素 delete(m,4)?
? ? ??map判断存在 val,exists :=m[4]

? ? ??很多人对go在语言层面内置slices和map持欢呼的态度,go为了内置slices(map)还添加关键字(go号称很吝啬关键字滴)。lua、python等语言都内置了很有特色的数据类型,go走的是一条方向(ruby、python的开发人员爽了吧)。也许真如go的开发者说的slices(map)是轻量快速的。?
4),控制语句
? ? go里控制语句精简了(去除了while、do)不少而更灵活了。
? ? A),if语句。if在条件表达式内不用加圆括号,但强制加大括号。变化点if的条件表达可以有初始化语句
????? ? if a:=1; a==0{}
? ? B),for语句
????? ? for?表达式; 条件; 表达式{} ????典型的C家族for
????? ? for?条件{}??????????????????????????????C家族while的替代
????? ? for{}????????????????????????????????????? 死循环
????? ? for和关键字range结合遍历数组、slices、map。类似于js的for in、java 的for(val : list.values())、C#的foreach.
????????? ? for key,value range array{}?? ??C),switch。明显的差别是go的switch?case里不用谢braek。
????? ? C1,case可以有条件表达式
????????? ? a:=1
????????? ? swich{
????????????? ? case a>0&& a<10:
????????????????? ? //dosomething
????????????? ? default:
?????????????????????//dosomething
????????????}
????? ? C2,case 连续匹配
? ? ? ? ? ? swich a{
????????????? ? case 1,2,3:
????????????????? ? //dosomething
????????????? ? default:
?????????????????????//dosomething
????????????}
????? ? C2,fallthrough.新关键字fallthrough让当前case匹配到下一个case里。。
? ? ? ? ? ? swich a{
????????????? ? case 1:fallthrough
? ? ? ? ? ? ? ? case 2:fallthrough
? ? ? ? ? ? ? ? case 3:fallthrough
????????????????? ? //dosomething
????????????? ? default:
?????????????????????//dosomething
????????????}
? ? ? ? C3,go的switch也有if语句一样的初始化语句
? ? ? ? ? ? swich a:=1;a{}

读书人网 >编程

热点推荐