Go基础语法 | 青训营笔记

60 阅读3分钟

Go语言具有以下特性:

  • 高性能,高并发
  • 语法简单
  • 丰富的标准库
  • 完善的工具链
  • 静态链接
  • 快速编译
  • 跨平台
  • 垃圾回收

在性能方面优于python,在业务方面优于C++。同时部署简单,学习成本低。

开始

package main

import "fmt"

fn main() {
  fmt.Printf("Hello, World!")
}

变量和内置数据类型

Go 语言是静态类型的,变量声明时必须明确变量的类型。值得注意的是吗,类型声明是在后面。

  • var a int
  • a := 1

简单类型

  1. 空值:nil
  2. 整数类型:int8,int16,int32
  3. 浮点类型:float32,float64
  4. 字节类型:byte(等价于uint8)
  5. 字符串类型:string
  6. 布尔类型: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

指针

指向某个对象的地址。类型定义时使用*符号,对一个变量取地址,使用&符号。

控制语句

条件控制

  1. if else
  2. 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)的并发。