Go 语言学习日志

早些时候就听说Go语言了,想来是谷歌自己闲着无聊开发出一种自我把玩和炫耀的东东。

最近偶然接触了Go,也觉得之前先入为主的思想导致了对其错误认识。现在悔改为时未晚。

看到市面上有本咱们自己人写的Go语言的书,可惜囊中羞涩,没能购买来欣赏一番。不过还好,除了要钱,咱们还有免费的。

Go开源精神还是值得敬佩的,不过换种思维就知道这是他们的一种战略思维,就如同android的一般。

秉持着免费的精神我来到了Go的官网,下载其安装包和一个入门的英文文档gobook.pdf(不能荒废了英语,虽然现在工作用的不怎么多)。开始了我的Go语言之旅。

刚开始接触觉得有点四不像。引入包需要用package,像java;输入需要用scanf(),和C语言的格式一样。每句代码末尾不用“;”,这个是python的……

我怀疑它吸收了各家之所长。它也有其他语言的共性,比如运行需要一个main()。

下面来分析几个语言本身涉及到的基础内容:

1,变量

  Go的变量和其他语言差别不大,不过也有很多不同的地方。比如int类型,它有uint8, uint16, uint32, uint64,int8, int16, int32 , int64。类型多了有好也有坏。

float也分为float32和float64,它也有string类型和布尔型。基本的数据类型差不多就这些,有意思的是它的变量定义。

变量定义:var x string = "hello word" (这种变量的表达方式比较接近人的思维,定义一个变量x,它的类型是string,它的值是hello word)

可以这样:x := "hello word" (这种定义让我感觉很有心意,x可以不用定义就使用)

也可以:

var x string   

 x = "hello word"

还有: var x = "hello word" (可以不用定义类型)

书上是推荐在任何可能的情况下使用 := 

变量的作用域和C的概念相同。

2,Control Structure

  Go也包含三种基本的结构,顺寻,循环,分支。

顺序:和以前是一样的,一条条的执行。忽略了一个最基本的概念,Go是个编译运行的语言。这一点和C是相同的。所以,包括它的各种操作和性能,都有可能会取代C在某些方面的应用。

循环:Go没有了while,只有for,但是它的for却有多种实现方式。

可以这样写:

for i <= 10 {
fmt.Println(i)
i = i + 1
}

也可以:

for i := 1; i <= 10; i++ {
fmt.Println(i)
}

分支:if还是那个if,不过条件不需要括号。有时候,一个语句不需要括号和分好的时候,不知道是喜是悲。可能还不太习惯,习惯了可能就好了。隐隐约约当中记得python是没有符号的。不过对这几门语言研究的都不是很深入。当编程不能成为工作的时候就让它成为一种爱好吧。

Go也有switch。它的switch不像C一样,必须要用break才能结束一个语句的执行。Go是一条语句执行完就结束。

3,Arrays, Slices and Maps

上面的这三种是Go语言的数据组织形式,array不用说是数组,定义为 var x [5]int (x是有5个int元素的数组),访问的时候和往常一样。x[n]。数组也支持 x :=[5]int{1,2,3,4,5}这样的初始化方式或者

x := [5]float64{
98,
93,
77,
82,
83,
}注意83后面多了一个逗号。

说道这里又突然想到一个问题:在c里我们这里这些写函数

main()

{

}

或者

main(){

}

都没有问题。

但是在Go中你只能

main(){

}写不然就会报错。对于这种格式的严格要求,能够很好的控制代码的结构。

 

slices:从文档里看到,slices和array没有太大的却别。唯一的却别就是slices是边长的,而array是定长的。数组的定义需要在[]内输入长度,而slices就不用了。创建slice需要内置的函数 x := make([]float64, 5) ,make也支持三个参数 x :=make([]float64,5,10),

其中10这个参数的解释为数组的长度,而5为slice的长度。也就是说slice是这个数组的一部分。英语是这么说的:

10 represents the capacity of the underlying array
which the slice points to(不知道理解是不是正确)

slice还有一种有趣的定义方式[low:high]:

arr := []float64{1,2,3,4,5}
x := arr[0:5]

 

 

 

相当于从数组中截取一部分。low是数组内开始的位置,high是数组内结束的部分。按照上面的例子,x中的数据时1,2,3,4,5。

slice还有两个重要的函数,append和copy。从字面意思上就可以理解了。不赘述,具体怎么用,可以去查手册。

Maps:功能最强大的数据集合终于出现了。书上给了这么一个例子var x map[string]int 英语的解释为:

“x is a map of strings to ints.” 这里其实就是在说明一个问题,map[datatype]datatype,[]内的部分未key的数据类型,最后面的为value的数据类型。当然也可以进行多重嵌套。从一开始看到这个地方的时候,我就开始怀疑,怎么没有多维数组呢?现在终于明白了。map就是一个多维数组了。

粘贴一个例子:

x := make(map[string]int)  //如果是 var x map[int]int
x["key"] = 10
fmt.Println(x["key"])

map在使用前必须要初始化。比如,第一句用注释中的内容,fmt.Println(x)访问数据就会报错。x只定义,并没有初始化。也就是说我要定义一个map,并把它make出来才能使用。map还有一个特点,就是可以删除其中的一个元素。delete(map_name,key).

map可以进行多重嵌套,这里贴出一段文档的代码:

func main() {
elements := map[string]map[string]string{
"H": map[string]string{
"name":"Hydrogen",
"state":"gas",
},
"He": map[string]string{
"name":"Helium",
"state":"gas",
},
"Li": map[string]string{
"name":"Lithium",
"state":"solid",
},

"Be": map[string]string{
"name":"Beryllium",
"state":"solid",
},
"B": map[string]string{
"name":"Boron",
"state":"solid",
},
"C": map[string]string{
"name":"Carbon",
"state":"solid",
},
"N": map[string]string{
"name":"Nitrogen",
"state":"gas",
},
"O": map[string]string{
"name":"Oxygen",
"state":"gas",
},
"F": map[string]string{
"name":"Fluorine",
"state":"gas",
},
"Ne":

map[string]string{
"name":"Neon",
"state":"gas",
},
}
if el, ok := elements["Li"]; ok {
fmt.Println(el["name"], el["state"])
}
}
注意到if语句中的条件。这是一种访问map 的方法。如果访问的数据存在,数据就被传入到el中,而ok中存储的是查找的有无,true说明找到了,false说明没找到。

慢慢来,后面的就真正涉及到Go的核心内容了。

【后续】

posted on 2012-09-17 17:32  zzzhhh  阅读(543)  评论(0编辑  收藏  举报

导航