Go语言基础 | 青训营笔记

399 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 1 天。 今天课程的主要内容是 Go 语言的基础。下面是我的主要内容笔记整理。

变量

声明:

  • var 变量名 类型

  • :=根据值类型自动推变量类型,eg:`a, b = 9

    Golang 是强类型语言,所有变量必须拥有类型,且变量仅仅可以存储特定类型的数据

  • 标识符为 _ 是匿名变量

  • const常量,不能用:=

if else

if 条件不用小括号,仍要大括号,且允许判断条件之前执行一个简单语句,并用分号 ; 隔开

if v := main.Pow(x, n); v < lim{
    return v
}

循环

Golang 只有一种循环:for,条件不需要小括号 初始化和后置语句是可选的,去掉分号,for 循环while

    for sum < 1000{
        sum += sum
    }

省略条件,循环不会结束,等同于 while(true)

    for{
        ...
    }

switch

Go 中每个 case 执行结束默认 break

如果希望从某个 case 顺序往下执行,可以使用 fallthrough 关键字

数组

数组定义:

var a[10] int
var strAry = []string{"aa", "bb", "cc", "dd", "ee"}//不指定初始个数也可以

数组大小不能改变

切片

数组大小固定,切片为数组元素提供动态大小

通过两个下标来界定,区间左闭右开

a[low : high]
eg:
a[1:4]
//包含 a 中下标从 1 到 3 的元素

map

map 是 key-value 的键值对存储结构,key 不能重复,底层用 hash 表存储

//字典初始化
var dic = map[string]int{
    "apple":1,
    "watermelon":2,
}
fmt.Printf("dic %+v\n", dic)

//创建
map [KeyType]ValueType
var m map[int]int
m := make(map[int]int)
m := map[int]int{
    1:1,
    2:2,
}

//读取
i := m[1]
v,ok := m[1]

//遍历
for key,value := range m{
    println("Key:", key, "Value:", value)
}

//删除
delete(m,1)

range

快速遍历 slice 或者 array,如

m := map[string]string{"a": ”A", "b": "B"}
for k, v := range m{
    fmt.Println(k, v)
}

函数

func 开头,驼峰命名法

首字母小写,包内使用;大写可以包外引入。

即小写 private,大写public

函数可以不接受参数,嚯接受多个参数

先变量名,再类型,再返回值类型

相同类型的两参数,类型可以只写一个

Golang 中函数可以返回任意多个返回值

函数返回值能命名 空的 return 语句默认返回所有已经定义的返回变量

defer 将函数推迟到外层函数返回之后执行。推迟调用的函数其参数会立即求值,但直到外层函数返回前函数都不会被调用

指针

& 取地址,*取地址中的值

没有指针运算

结构体

近似地认为:一个结构体就是一个类,结构体内部的字段,就是类的属性。

组成结构体类型的数据成为字段。每个字段都有一个类型和一个名字;在一个结构体中,字段名字必须是唯一的

结构体中同样遵循大小写设置公有私有,结构体内字段也是

结构体方法

方法是一种特殊的函数

func函数名 之间,加上接收者的类型

错误处理

用 error 包,多返回一个 err

JSON 处理

encoding/json包,结构体保证第一个字母大写,能用 json.Marshal()序列化,之后需要 string强转字符串

时间处理

time包,使用和 C++ 差不多

数字解析

strconv包,实现字符串与数字之间的转换。 strconv.ParseFloat("数字",进制,精度) strconv.Atoi("数字"),直接转 int

进程信息

os包和os/exec

os.Args获取进程执行时的命令行参数

os.Getenv或者os.Setenv获取或写入环境变量‵

exec.Command快速获取子进程及获取输入输出