go语言基础教程1
什么是Go?来自于网站:
Go 编程语言是一个使得程序员更加有效率的开源项目。Go 是有表达力、简洁、清晰和有效率的。它的并行机制使其很容易编写多核和网络应用,而新奇的类型系统允许构建有弹性的模块化程序。Go 编译到机器码非常快速,同时具有便利的垃圾回收和强大的运行时反射。它是快速的、静态类型编译语言,但是感觉上是动态类型的,解释型语言。
首先介绍go语言的特性--
- 并行 :Go 让函数很容易成为非常轻量的线程。这些线程在Go 中被叫做goroutines;
- Channel : 这些goroutines 之间的通讯由channe完成;
- 快速 : 编译很快,执行也很快。目标是跟C 一样快。编译时间用秒计算;
- 安全 :当转换一个类型到另一个类型的时候需要显式的转换并遵循严格的规则。Go 有垃圾收集,在Go 中无须free(),语言会处理这一切;
其次介绍go语言中的package,如何获取一个内建的package信息。可以通过--go doc fmt、go doc hash。
下面就让我们进入go世界的hello world~!
1 package hello //如果改成package main就可以 2 3 import "fmt" 4 5 func main() { 6 fmt.Printf("hello world\n") 7 }
上面这个程序是无法运行的,原因有三点:
- 所有的Go 文件以package <something>开头,对于独立运行的执行文件必须是package main;
- 这是说需要将fmt 包加入main。不是main 的其他包都被称为库
- package main 必须首先出现,紧跟着是import。在Go 中,package 总是首先出现,然后是import,然后是其他所有内容。当Go 程序在执行的时候,首先调用的函数是main.main(),这是从C 中继承而来。这里定义了这个函数;
go语言中单独一条语句,自动结尾插入分号,但是如果希望一个或者更多的语句放在同一行上,记得在在语句之间加上分号。不然是无法编译执行的。
1 package main 2 import "fmt" 3 4 var b int = 10 5 //b := 10 这种声明和赋值连在一起的方式是不允许在函数外面使用的 6 func main() { 7 a := 15 //函数内部可以使用 8 fmt.Printf("hello world %d %d\n",a,b) 9 }
多个var 声明可以成组;const 和import 同样允许这么做。留意圆括号的使用:
var (
x int
b bool
)
有相同类型的多个变量同样可以在一行内完成声明: var x, y int 让x 和y 都是int 类型变量。同样可以使用平行赋值:
a, b := 20, 16
Go 的编译器对声明却未使用的变量在报错。
Go 有众所周知的类型如int,这个类型根据你的硬件决定适当的长度。意味着在32 位硬件上,是32 位的;在64 位硬件上是64 位的。注意:int 是32 或64 位之一,不会定义成其他值。uint 情况相同。如果你希望明确其长度,你可以使用int32 或者uint32。完整的整数类型列表(符号和无符号)是int8,int16,int32,int64 和byte,uint8,uint16,uint32,uint64。byte 是uint8 的别名。浮点类型的值有float32 和float64 (没有float 类型)。64 位的整数和浮点数总是64 位的,即便是在32 位的架构上。
枚举类型--
const (
a = iota //第一个iota 表示为0,因此a 等于0,当iota 再次在新的一行使用时,它的值增加了1,因此b 的值是1。
b = iota
c = iota
)
字符串--
字符串在Go 中是UTF-8 的由双引号(”)包裹的字符序列。如果你使用单引号(’)则表示一个字符。
控制语句:
- if-else
1 if x > 0 { <-- { is mandatory //无需圆括号,但是if的第一个{必须和if同行 2 return y 3 } else { 4 return x 5 }
- for
Go 的for 循环有三种形式,只有其中的一种使用分号。
for init; condition; post { } 和C 的for 一样
for condition { } 和while 一样
for { } 和C 的for(;;) 一样(死循环)
循环嵌套循环时,可以在break 后指定标签。用标签决定哪个循环被终止: J: for j := 0; j < 5; j++ { for i := 0; i < 10; i++ { if i > 5 { break J 现在终止的是j 循环,而不是i 的那个 } println(i) } }
1 它不会匹配失败后自动向下尝试,但是可以使用fallthrough 使其这样做。没 2 有fallthrough: 3 switch i { 4 case 0: // 空的case 体 5 case 1: 6 f() // 当i == 0 时,f 不会被调用! 7 } 8 而这样: 9 switch i { 10 case 0: fallthrough 11 case 1: 12 f() // 当i == 0 时,f 会被调用! 13 } 14 用default 可以指定当其他所有分支都不匹配的时候的行为。 15 switch i { 16 case 0: 17 case 1: 18 f() 19 default: 20 g() // 当i 不等于0 或1 时调用 21 }