在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
谷歌系统所使用的编程语言Go,近年来发展的越来越成熟、方便易用。现在,我们可以通过使用LiteIDE让Go语言编程变得更加简单。 第一步 语言基础 数据、类型、函数、控制 安装和配置Go语言,你只需要下载合适的二进制文件至正确的位置,再为Go工具定位那些文件所在的目录路径就好了。 如果你使用的是OSX或Windows操作系统,那么你可以使用安装包来完成这一些列工作。
复制代码 代码如下:package main import "fmt" func main() { fmt.Printf("hello, world\n") } 你可以使用记事本或其他文本编辑器编辑上面这段代码,并将代码保存为hello.go文件。然后打开终端,输入: go run hello.go 接下来你就可以进行LiteIDE的安装并尝试运行程序了。 https://code.google.com/p/golangide/ 下载完成后将其解压至合适的目录。如果你是用的是Windows,那你可能需要使用7z来解压。 如此简洁的安装过程必然不会为你创建快捷方式,因此你可能需要打开...\liteide\bin然后找到liteide.exe并手动创建快捷方式。
现在我们暂时无需理会这些组件,让我们先从一个简单的小程序开始。
复制代码 代码如下:LiteIDE会预先为你在工程目录下创建main.go和doc.go文件。main.go文件中包含以下内容: </p> <p>// Hello project main.go package main import ( "fmt" ) func main() { fmt.Println("Hello World!") } 你可以点击工具栏上蓝色的编译执行按钮BR运行代码。你可以在在Build菜单中的B和BR按钮菜单中找到更多的关于编译和执行代码的命令。 复制代码 代码如下:uint8 无符号8位 整型数(0 到 255) uint16 无符号16位 整型数(0 到 65535) uint32 无符号32位 整型数(0 到 4294967295) uint64 无符号 64位 整型数(0 到 18446744073709551615)</p> <p> int8 8位 整型数(-128 到 127) int16 16位 整型数(-32768 到 32767) int32 32位 整型数(-2147483648 到 2147483647) int64 64位 整型数(-9223372036854775808 到 9223372036854775807)</p> <p> float32 IEEE-754 32位 浮点数 float64 IEEE-754 64位 浮点数</p> <p> complex64 复数 32位实数+32位虚数 complex128 复数 64位实数+64位虚数</p> <p> byte uint8的别称 rune int32的别称 最大的惊喜就在于,Go语言支持复数类型的数据: 复制代码 代码如下:var z complex64 z = 1.0 + 2.0i fmt.Println(z) 如果你想知道rune是什么,那么当你知道rune被用来存储一个Unicode字符的时候,这个问题也就应该迎刃而解了吧。换句话说,rune在Go语言中等价于字符(char)类型。 当然你也可以使用uint、int卷二uintptr这些依赖于系统类型(32位或64位)的整数类型。 另外一个新颖的地方,当你定义一个变量的时候,你变量的后面对其类型进行定义,而不是在前面。 当你在定义中初始化了变量,你无需对变量指定数据类型。如果在定义的时候未初始化,则变量将会被赋予0值: var i=0 和数字类型一样,Boolean 类型也有相似的特征。 编译器会完成相应的工作。 一个使用Go语言定义和初始化变量的简单例子: x,y:=1,2 你也可以定义和使用常量。 数据结构 字符串是Unicode编码,其值不能修改,而其他方面和你想的差不多。 s="Hello" 可以使用len函数获取字符串的长度,使用索引操作符[0]可以访问字符串中的字符。Go语言中的字符串类型相当简陋,但使用stirng package可以实现类似其他语言字符串的所有功能。 数组(arrays)以中括号([])声明,索引从零开始。例如: 复制代码 代码如下:var buff [32]byte fmt.Println(buff[10]) 多维数组通过数组的数组实现, 复制代码 代码如下:var buff [32][32]byte fmt.Println(buff[10][0]) 数组(array)不是动态的,不能动态分配大小。但可以使用切片(slice)实现同样的效果。切片包含数组(array)的一部分,可以动态变更大小。 复制代码 代码如下:func main() { </p> <p> type point struct { x, y int } var p = point{10, 10} fmt.Println(p.x) } 上例声明了新的结构体类型,包括两个成员x和y。在main函数中创建并初始化了该结构体类型的实例(instance)。Go语言通常不使用术语“实例(instance)”,而更喜欢使用术语“值(value)”,所以你是创建了该类型的一个值(value)。 这是我们首次介绍Go类型,关于这个话题之后还有更多内容。 复制代码 代码如下:var m = make( map[string]int) m["mike"] = 10 m["lucy"] = 30 fmt.Println(m["lucy"]) 显示结果是30. make函数是能够基于Type(类型)创建Value(值)(译注:可以理解为实例)的两个函数之一,要详细了解它,我们需要学习更多关于类型的内容。 类型 你可以用一个立即数(literal )或指定的类型来定义一个类型变量,以达到类型重用的目的。 自定义类型是由一些小的数据类型整合而成的,如数组、结构体、指针、很熟、接口、片、map和channel。 定义类型的方法: type 类型名 数据类型 例: type myint int 定义myint为一个整型类型。如果你想创建一个扩展类型,重新定义之前声明过的类型的数据类型也很常用,实现的函数和方法我们之后再讲。 更为通常的做法,你可以使用某些数据类型组成你自定义的类型: 复制代码 代码如下:type point struct { x, y int } 这就是一个新的类型结构。 你也可以声明数组类型: type myarray [20]int 你可以在定义类型时使用自定义类型: 复制代码 代码如下:type point struct { x, y int } type arrayPoints [10]point 这就创建了一个point类型的数组。 你可以自行探索其他的类型定义方式。接下来我们要做的是理解Go能用这些类型完成什么工作? 类型主要被用于下面两个方面: 类型检测 创建值 例: 复制代码 代码如下:var c myint c = "string" 上面的代码编译将不会通过。但下面的代码: 复制代码 代码如下:var c myint c = 1 将会通过编译。因为“c”和“1”都是整型数据。 var i int 或 var p point 但对于slice(片)、map和channel来说他们必须使用make函数创建对应类型的值。 复制代码 代码如下:var m = make( map[string]int) make函数是Go语言支持的两个分配函数中的一个,另一个是new函数。make函数创建了一个指定类型的值,并把该值得指针返回给变量。在大多数地方,Go中的指针与C中的指针使用方法类似。 举一个new函数的例子: 复制代码 代码如下:var add= new(int) 在这里,new函数创建了一个整型变量并放回了它的地址存放在add中。变量add的类型为*int。 如果你写出如下语句 复制代码 代码如下:fmt.Print(add) 那么你将得到这个整型值得地址。那么,为了打印这个整型变量的值,我们需要这样书写打印语句: 复制代码 代码如下:fmt.Print(*add) 就像之前提到过的那样,你可以直接使用类型的值而无需给这个类型命名: 复制代码 代码如下:var p struct { x, y int } 如果你不需要重用这个类型,那么这样做也是可以的。 函数 复制代码 代码如下:var myFunc = func(a, b int) int { return a + b } 可以指定参数类型和返回值类型,如果指定了返回值类型,则函数中必须有return语句。 函数值(value)被赋值给了变量myFunc。也可以按照通常的方式定义函数,这是变量myFunc就是函数的名称。 复制代码 代码如下:func myFunc(a, b int) int { return a + b } 无论那种方式,函数都可以使用下面的方式调用: 复制代码 代码如下:fmt.Println(myFunc(1, 2)) 可以在return语句中返回多个值,并且可以在函数头中指定返回值的名称。 例如: 复制代码 代码如下:func myFunc(a, b int) (sum int) { sum = a + b return } sum就是函数的返回值。 返回多个值也很简单: 复制代码 代码如下:func myFunc(a, b int) (int, int) { return a + b, a - b } 必须全部接收函数的两个返回值: 复制代码 代码如下:x,y := myFunc2(1, 4) fmt.Println(x,y) 其他语言中可以选择只接收一个返回值,但在Go语言中不可以。 传值——指针 复制代码 代码如下:func myFunc(a, b int) int { a = 1 return a + b } 函数中对形参a的赋值语句,对实参没有任何影响。就是说 复制代码 代码如下:x, y := 2, 3 var sum = myFunc(x, y) fmt.Println(sum, x) 显示结果是4和2。x的值没有变化。 如果想要改变实参的值,就需要传入指针(译注:即传地址或传引用)作为参数。例如,变更函数定义如下: 复制代码 代码如下:func myFunc(a *int, b int) int { *a = 1 return *a + b } 参数a以指针的形式传入,对a的赋值语句改变a指向的变量。调用函数时,我们需要传入变量的地址作为参数: 复制代码 代码如下:var sum = myFunc(&x, y) fmt.Println(sum, x) 现在显示结果是4和1,x的值变更了。 如果函数定义中的参数是*int类型,而调用该函数时没有使用&操作数,那么在编译阶段类型检查时就会报错,而C语言没有这个功能。 总之,Go语言的指针类型,可以作为实参传递给函数,但无法在数据上耍一些”聪明“的技巧。 作用域和闭包 例: 复制代码 代码如下:var a1 int = 1 func main() { fmt.Println(a1) var a2 int = 2 var myFunc = func() int { return a2 } fmt.Println(myFunc()) } 在这个例子中,a1是一个全局变量,可以被所有函数访问。a2在main函数内定义,因此它可以被main函数和main中的myFunc函数访问。 例: 复制代码 代码如下:func myFunc() func() int { var a int = 1 return func() int { return a } } 在这里,内部函数以func() int的方式返回给外部函数。函数和它的内容都是以类型的方式返回的。返回的函数将会返回外部函数定义的变量的值,这就是闭包的作用。 因此 复制代码 代码如下:myClosure := myFunc() fmt.Println(myClosure()) 输出结果为 1. 每个闭包都有一份与自己绑定的变量副本,闭包不会实现不同函数副本之间的数据共享。 实际上,Go语言只提供了很少的控制结构,它极大简化了控制语句的使用。 复制代码 代码如下:for 条件{ 操作 } 需要注意的是,你无需将循环的条件置于一对大括号“{}”中。循环将会在不满足条件时终止。循环将会在每次执行循环体前检查条件是否满足,因此循环体可以被执行0次或很多次,类似于while循环。 例: 复制代码 代码如下:i:=0 for a<10 { fmt.print(a) a=a+1 } 你可以通过使用for true {" 或者 "for {" 来创建一个不会终止的循环。 复制代码 代码如下:枚举循环与其他类似C的语言基本相同: for 表达式1 ; 条件 ; 表达式3{ 操作 } 表达式1会在循环开始前执行一次,表达式3会在每次循环体执行结束后执行一次,条件语句会在每次循环体执行之前被检查,如果为true则继续执行循环。 例: 复制代码 代码如下:for i:=0; i<10; i++ { fmt.print(a) } 你可以在for表达式中加入任何语句,但前提是你得加入分号以区分你的语句属于表达式的哪个部分。但也有一种情况例外,你创建的条件表达式无需条件语句。 你也可以在for表达式中反复申明数组、片、字符串、map或channel中的值,用法与其他语言中的for循环类似。 例如: 复制代码 代码如下:var array= [] int {1,2,3,4} for i,v:= range array { fmt.print(i,v) } for表达式的循环次数取决于索引和数组的大小,好比这里的i和v。 在Go语言中,还存在另外两种控制语句。if语句除了没有大括号包围的条件语句外,与其他语言中的if语句基本相同。 例: 复制代码 代码如下:if a<0 { fmt.print("Negative") } else { fmt.print("Positive") } else条件不是必须的,但一对大括号必须完整: if a<0 { fmt.print("Negative") } 你也可以通过使用else if创建一个符合条件表达式: 复制代码 代码如下:if a<0 { fmt.print("Negative") } else if a==0 { fmt.print("Zero") } else { fmt.print("Positive") } 你也可以在if主体内容执行之前执行初始化语句: 复制代码 代码如下:if a:=myfunc() a<0 { fmt.print("Negative") } 所有在条件语句中创建的变量,只在条件表达式中适用。 另一种条件表达式为switch,它的存在是为了应对在一个条件中有较多选项的情况。如: 复制代码 代码如下:switch a { case 0,1: fmt.print("a is 0 or 1) case 2.3: fmt.print("a is 2 or 3) default: fmt.print("a is some other value") } 你也可以用下面的方式书写条件语句: 复制代码 代码如下:case a<0: 在Go语言中,你无须用break跳出条件选择。如过你想从一个case进入接着的另一个case,那么你可以使用fallthrough语句 (注:fallthrough表示继续执行下面的Case而不是退出Switch)。case语句是按顺序执行的,一旦有相对应的情况,执行完case中的语句后程序将会自动调用break跳出选择,因此default选项往往被放在最后。 除了对值和条件的匹配,你可以对类型进行匹配,如: 复制代码 代码如下:switch a.type{ case int: fmt.print("a is an int") case float64: fmt.print("a is a float") default: fmt.print("some other type") } 最后,你可以使用break终止循环或continue终止当前循环并直接进入下一次循环,break也可以被用于switch语句中。 虽然Go语言中也有goto语句,但这还是不讲为好。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论