Go语言具有以下特性:
- 高性能,高并发
- 语法简单
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
在性能方面优于python,在业务方面优于C++。同时部署简单,学习成本低。
开始
package main
import "fmt"
fn main() {
fmt.Printf("Hello, World!")
}
变量和内置数据类型
Go 语言是静态类型的,变量声明时必须明确变量的类型。值得注意的是吗,类型声明是在后面。
var a inta := 1
简单类型
- 空值:
nil - 整数类型:
int8,int16,int32等 - 浮点类型:
float32,float64 - 字节类型:
byte(等价于uint8) - 字符串类型:
string - 布尔类型:
boolean
字符串
在 Go 语言中,字符串使用 UTF8 编码,UTF8 的好处在于,如果基本是英文,每个字符占 1 byte,和 ASCII 编码是一样的,非常节省空间,如果是中文,一般占3字节。
数组和切片
声明数组:
var arr [3]int
var arr1 [3][3]int
数组的长度不能改变,如果想拼接2个数组,或是获取子数组,需要使用切片。
声明切片:
var slice []int
slice := make([]int, 0) // 初始长度为0
slice := make([]int, 3) //初始长度为3
切片是数组的抽象。 切片使用数组作为底层结构。切片包含三个组件:容量,长度和指向底层数组的指针,切片可以随时进行扩展
字典
存储键值对(key, value)的一种关联容器,底层可能是哈希表或者红黑树。 使用:
m1 := make(map[string]int)
m2 := map[string]string {"Tom": "123", "Jerry": "456"}
m1["x"] = 12
指针
指向某个对象的地址。类型定义时使用*符号,对一个变量取地址,使用&符号。
控制语句
条件控制
- if else
- switch
if age := foo(); age < 18 {
// do it
} else {
// do another thing.
}
switch不需要break, 只匹配到每个case,默认不往下执行。switch可以有两种形式,一种和c中的switch相似,另外一种可以在每个case中有比较运算。
循环语句
只有for一种。但有多种形式,
for i < n {...}
for i := 0; i < n; i++ {...}
for index, elem := range arr {...}
函数
使用关键字 func,参数可以有多个,返回值也支持有多个
结构体,方法,接口
结构体类似于其他语言中的 class,可以在结构体中定义多个字段,为结构体实现方法,实例化等
type Student struct {
name string
age int
}
// 这是方法
func (stu *Student) hello(person string) string {
return fmt.Sprintf("hello %s, I am %s", person, stu.name)
}
接口定义了一组方法的集合,接口不能被实例化,一个类型可以实现多个接口。如果定义了一个没有任何方法的空接口,那么这个接口可以表示任意类型。
并发编程
Go 语言提供了 sync 和 channel 两种方式支持协程(goroutine)的并发。