1. Go语言简介
Go语言是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译并发型语言。Go语言具有以下特点:
- 高性能、高并发
- 语法简单易懂,类似于C语言
- 拥有功能完善、质量可靠的标准库
- 丰富的工具链,包括单元测试框架
- 静态编译,部署方便
- 快速编译
- 跨平台支持8. 带垃圾回收的语言
2. Go语言基础语法
2.1 Hello World
package main
import "fmt"
func main() {
fmt.Printf("Hello World!")
}
编写源文件时,必须在非注释的第一行指明这个文件属于哪个包,如package main。
import "fmt"表示导入了一个fmt包,它包含了一些基本的格式化输出。
Go函数以关键字func开头。每一个可执行程序中必须拥有一个main函数。
另外,Go程序并不要求开发者在每个语句后面加上分号表示语句结束,一行代表一个语句结束。
2.2 变量
常见的变量类型包括字符串、整数、浮点型、布尔型。其中字符串是内置类型,可以直接通过加号去拼接。
Go语言中声明变量通常使用 var 关键字,具体格式为:var 变量名 = 数据
var a = "initial"
var b, c int = 1, 2
var e float64
f := float32(e)
g := a + "foo"
fmt.Println(a, b, c, d, e, f) // initial 1 2 true 0 0
fmt.Println(g) // initialfoo
通过这种方式去声明变量,可以直接通过变量的初始值来判断变量类型。如果有需要也可以写出变量的类型,参考第三行代码。
另一种方法是使用:=符号,使用格式变量名 := 数据
a := 123
b := "abc"
2.3 if else
和c语言类似,相关的条件语句如下表所示:
| 语句 | 描述 |
|---|---|
| if 语句 | if 语句 由一个布尔表达式后紧跟一个或多个语句组成。 |
| if…else 语句 | if 语句 后可以使用可选的 else 语句, else 语句中的表达式在布尔表达式为 false 时执行。 |
Go语言中的if语句的用法和C相差不大。需要注意的是if后面必须直接加大括号,不能像C或者C++一样,把if里面的语句写到同一行。
if 表达式 {
/* 在表达式为真时执行 */
} else {
/* 在表达式为假时执行 */
}
2.4 循环
在Go语言中只有唯一的一种for循环。最简单的for循环就是在表达式里面什么都不写,形成一个死循环。也可以使用经典的C循环,例如第12行代码
package main
import "fmt"
func main() {
i := 1
for {
fmt.Println("loop")
break
}
for j := 7; j < 9; j++ {
fmt.Println(j)
}
for n := 0; n < 5; n++ {
if n%2 == 0 {
continue
}
fmt.Println(n)
}
for i <= 3 {
fmt.Println(i)
i = i + 1
}
}
在循环里面有两个关键操作break和continue,break操作是跳出当前循环,continue是跳过本次循环。\
2.5 switch
Go语言中的switch分支结构看起来也和C或者C++比较类似。这里有一个很大的不同点是在C++里面,case语句后如果不加break跳出的话,会继续往下跑完所有的case分支。但是在Go语言中是不需要加的,匹配成功后不会自动向下执行其他case,而是跳出整个switch。
package main
import (
"fmt"
"time"
)
func main() {
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
case 4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
}
2.6 数组
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。Go语言中声明数组的格式:
var 数组名 [数组的长度]数据类型
数组的每个元素可以通过索引下标来访问,索引下标的范围是从0开始到数组长度减1的位置。
package main
import "fmt"
func main() {
var a [10]int
for i := 0; i < 10; i++ {
a[i] = i + 1
fmt.Printf("a[%d] = %d\n", i, a[i])
}
2.7切片
简单地说,切片就是一种简化版的动态数组。因为动态数组的长度不固定,切片的长度自然也就不能是类型的组成部分了。数组虽然有适用它们的地方,但是数组的类型和操作都不够灵活,而切片则使用得相当广泛。
我们可以使用make函数来创建一个切片
slice1 := make([]type, len)
append() :可以向切片中增加元素。
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2]) // c
fmt.Println("len:", len(s)) // 3
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println(s) // [a b c d e f]
copy():在两个 slice 间复制数据,复制⻓度以 len 小的为准,两个 slice 可指向同⼀底层数组。
c := make([]string, len(s))
copy(c, s)
fmt.Println(c) // [a b c d e f]
2.8 map
Go语言中的map(字典)是一种内置的数据结构,它是一个无序的key—value对的集合,比如以身份证号作为唯一键来标识一个人的信息,map是实际使用过程中使用最频繁的数据结构。我们可以用make去创建一个空map。
m := make(map[string]int)
插入数据
m["one"] = 1
m["two"] = 2
fmt.Println(m) // map[one:1 two:2]
fmt.Println(len(m)) // 2
fmt.Println(m["one"]) // 1
fmt.Println(m["unknow"]) // 0
我们可以使用ok获取这个在map中这个key是否存在,如下:value, ok := map[key] ,其中的value是返回值,ok是一个bool值,可知道key/value是否存在。
r, ok := m["unknow"]
fmt.Println(r, ok) // 0 false
删除数据
delete(m, "one")
fmt.Println(m) //map[two:2]
}