GO语言入门
不管从什么方面来说,LiteIDE并不是编写Go程序的必备工具,你所需要的只是一个编辑器而已。这样说的确没错,但是对于一个新人,一个好的IDE可以使他更容易上手一门语言,并迅速投入开发。 美中不足的是,LiteIDE没有使用手册。 你可以从下面的网址上下载tar或zip压缩包 https://code.google.com/p/golangide/ 下载完成后将其解压至合适的目录。如果你是用的是Windows,那你可能需要使用7z来解压。 如此简洁的安装过程必然不会为你创建快捷方式,因此你可能需要打开...\liteide\bin然后找到liteide.exe并手动创建快捷方式。 |
数据结构常用的数据结构有字符串(strings),数组(arrays)和结构体(structs),以及另一位颇受欢迎的成员map。 字符串是Unicode编码,其值不能修改,而其他方面和你想的差不多。 s="Hello" 可以使用len函数获取字符串的长度,使用索引操作符[0]可以访问字符串中的字符。Go语言中的字符串类型相当简陋,但使用stirng package可以实现类似其他语言字符串的所有功能。 数组(arrays)以中括号([])声明,索引从零开始。例如: var buff [32]byte 多维数组通过数组的数组实现, var buff [32][32]byte 数组(array)不是动态的,不能动态分配大小。但可以使用切片(slice)实现同样的效果。切片包含数组(array)的一部分,可以动态变更大小。 结构体(structs)与其他语言类似,如下: func main() { type point struct { 结构体定义中可以嵌套结构体作为成员。初始化器(initializer){10,10}是结构体literal(译注:literal可以理解为立即数,见维基)。在结构体literal中也可以使用成员名例如{X:10}。 这是我们首次介绍Go类型,关于这个话题之后还有更多内容。 最后一个数据类型是Map,等价于其他语言中的hash map,关联数组(associative array)或者字典(dictionary)。 给定键的类型以及值的类型就能创建Map。如果从来没有使用过关联数组,那就把它想象成一个数组,数组的值不是通过索引访问,而是通过通用类型的键访问。例如。: var m = make( map[string]int) 显示结果是30. make函数是能够基于Type(类型)创建Value(值)(译注:可以理解为实例)的两个函数之一,要详细了解它,我们需要学习更多关于类型的内容。 |
|
Go语言的类型起到的作用与众所周知的面向对象的设计语言(Java、C++)有很大的不同,它没有所谓的层次划分、没有类的概念也不存在继承。类型是可以被推断出来的,如:Go使用鸭子类型。你可以用一个立即数(literal )或指定的类型来定义一个类型变量,以达到类型重用的目的。 自定义类型是由一些小的数据类型整合而成的,如数组、结构体、指针、很熟、接口、片、map和channel。 定义类型的方法: type 类型名 数据类型 例: type myint int 定义myint为一个整型类型。如果你想创建一个扩展类型,重新定义之前声明过的类型的数据类型也很常用,实现的函数和方法我们之后再讲。 更为通常的做法,你可以使用某些数据类型组成你自定义的类型: type point struct { 这就是一个新的类型结构。 你也可以声明数组类型: type myarray [20]int 你可以在定义类型时使用自定义类型: type point struct { 这就创建了一个point类型的数组。 你可以自行探索其他的类型定义方式。接下来我们要做的是理解Go能用这些类型完成什么工作? 类型主要被用于下面两个方面:
和
类型检测很常见——你只能赋予你定义的变量与之相同类型的值。在编译时编译器会依此对静态类型进行检查。 例: var c myint 上面的代码编译将不会通过。但下面的代码: var c myint 将会通过编译。因为“c”和“1”都是整型数据。 |
函数Go不是一种基于类并且有层次结构的语言,也不使用通常的方式处理对象。如果你仅仅打算实现一个函数,那就不用考虑有关对象的内容。函数就是一个值(Values),是“一等对象“。 如下,声明一个函数 var myFunc = func(a, b int) int { 函数值(value)被赋值给了变量myFunc。也可以按照通常的方式定义函数,这是变量myFunc就是函数的名称。 func myFunc(a, b int) int { fmt.Println(myFunc(1, 2)) 可以在return语句中返回多个值,并且可以在函数头中指定返回值的名称。 例如: func myFunc(a, b int) (sum int) { 返回多个值也很简单: func myFunc(a, b int) (int, int) { x,y := myFunc2(1, 4) |
|
传值——指针所有的形参都是以传值的方式传入,所以对形参做的任何改变都不会影响实参。例如: func myFunc(a, b int) int { x, y := 2, 3 如果想要改变实参的值,就需要传入指针(译注:即传地址或传引用)作为参数。例如,变更函数定义如下: func myFunc(a *int, b int) int { var sum = myFunc(&x, y) *和&操作符的用法对C程序员来说是非常熟悉的,这体现了Go语言较为初级的一面。有争议说在现代语言中所有的参数都应该以传引用的方式传入。 如果函数定义中的参数是*int类型,而调用该函数时没有使用&操作数,那么在编译阶段类型检查时就会报错,而C语言没有这个功能。 总之,Go语言的指针类型,可以作为实参传递给函数,但无法在数据上耍一些”聪明“的技巧。 |
|
作用域和闭包你可以以嵌套的方式在函数中定义函数。在某块代码中定义的变量只会在该块代码区域和该代码区域内的区域生效。这意味着你可以在函数之外定义全局变量,那么所有的函数将都能使用这个变量。 例: var a1 int = 1 在这个例子中,a1是一个全局变量,可以被所有函数访问。a2在main函数内定义,因此它可以被main函数和main中的myFunc函数访问。 Go同样支持闭包。如果你在一个函数中定义了另一个函数,那么这个在内部的函数将能够访问外部函数的变量,即使外部函数已经终止运行。在外部函数停止后保持内部函数的唯一方法是将其作为一个返回值返回给外部函数。 例: func myFunc() func() int { 在这里,内部函数以func() int的方式返回给外部函数。函数和它的内容都是以类型的方式返回的。返回的函数将会返回外部函数定义的变量的值,这就是闭包的作用。 因此 myClosure := myFunc() 输出结果为 1. 每个闭包都有一份与自己绑定的变量副本,闭包不会实现不同函数副本之间的数据共享。 |
|
Go 控制现在我们已经了解过了数据、类型和函数。接下来我们将讨论另一个重要的问题:Go语言提供的控制语句。 实际上,Go语言只提供了很少的控制结构,它极大简化了控制语句的使用。 Go语言是一种块结构的编程语言,它使用"{}"将一组代码组成块。如果你一直在奇怪其他编程语言中经常使用的“;”去了哪里,我可以很明确的告诉你,在Go中它依然存在,只是在编译过程中它会自动为你加上“;”。如果你也在代码末尾加上分号,那么编译器将会认为它们是不需要的字符,从而自动剔除这些分号。 for循环是Go语言中的唯一一种循环。for循环可以被用来创建条件循环和枚举循环。 for循环具有下面这种形式: for 条件{ 需要注意的是,你无需将循环的条件置于一对大括号“{}”中。循环将会在不满足条件时终止。循环将会在每次执行循环体前检查条件是否满足,因此循环体可以被执行0次或很多次,类似于while循环。 例: i:=0 for a<10 { 你可以通过使用for true {" 或者 "for {" 来创建一个不会终止的循环。 枚举循环与其他类似C的语言基本相同: for 表达式1 ; 条件 ; 表达式3{ 表达式1会在循环开始前执行一次,表达式3会在每次循环体执行结束后执行一次,条件语句会在每次循环体执行之前被检查,如果为true则继续执行循环。 例: for i:=0; i<10; i++ { 你可以在for表达式中加入任何语句,但前提是你得加入分号以区分你的语句属于表达式的哪个部分。但也有一种情况例外,你创建的条件表达式无需条件语句。 你也可以在for表达式中反复申明数组、片、字符串、map或channel中的值,用法与其他语言中的for循环类似。 例如: var array= [] int {1,2,3,4} for表达式的循环次数取决于索引和数组的大小,好比这里的i和v。 |
|
在Go语言中,还存在另外两种控制语句。if语句除了没有大括号包围的条件语句外,与其他语言中的if语句基本相同。 例: if a<0 { else条件不是必须的,但一对大括号必须完整: if a<0 { 你也可以通过使用else if创建一个符合条件表达式: if a<0 { 你也可以在if主体内容执行之前执行初始化语句: if a:=myfunc() a<0 { 所有在条件语句中创建的变量,只在条件表达式中适用。 另一种条件表达式为switch,它的存在是为了应对在一个条件中有较多选项的情况。如: switch a { 你也可以用下面的方式书写条件语句: case a<0: 在Go语言中,你无须用break跳出条件选择。如过你想从一个case进入接着的另一个case,那么你可以使用fallthrough语句 (注:fallthrough表示继续执行下面的Case而不是退出Switch)。case语句是按顺序执行的,一旦有相对应的情况,执行完case中的语句后程序将会自动调用break跳出选择,因此default选项往往被放在最后。 除了对值和条件的匹配,你可以对类型进行匹配,如: switch a.type{ 最后,你可以使用break终止循环或continue终止当前循环并直接进入下一次循环,break也可以被用于switch语句中。 虽然Go语言中也有goto语句,但这还是不讲为好。 下节预告下一部分我们将会学习在Go语言中类型是如何创建对象和调用方法、接口的。 |
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。