GO语言基础 | 青训营笔记

56 阅读2分钟

1. Hello world

import main
import (
    'fmt'
)
func main() {
    fmt.Println("Hello world")
}


2. 数据类型

大体同c/c++ 类似, 一种强变量类型的语言, 可以使用 var 关键字自行推导变量的类

2.1 变量声明

格式 1: var var_name [[type] = 具体值] //一次声明多个变量,且都进行初始化
格式 2: var_name := 具体值

2.2 常量声明

const var_name [type] = 值  // 使用等号赋值

2.3 变量是用 := 还是 =

对于新声明的变量,若使用格式2进行声明, 则使用 := (也就是不带var 关键字的变量声明使用:=)
其余情况下,好像都是使用 =



3. if 语句

大体同c/c++, 不同点可以从下述代码中看出:

if a > 1 {
    fmt.Println("a > 1")
}
else {
    fmt.Println("a <= 1")
}

如上, if后面的判断语句同 Python 一样不需要加括号。但是后面所要执行的语句无论数量,都需要被花括号所括起来



4. 循环语句

不同于其他语言, 在go语言中,只有一种 for 循环

for {
    // 死循环, 配合 continue , break
    ...
}
for expr1; expr2; expr3 {
    // 同 c/c++ 中的 for 循环一样
    ...
}
for expr2 {
    // 同 c/c++ 中的 while 类似
    ...
}


5. switch语句

与c/c++ 中switch 语句最大的不同在于, 每一个case分支的末尾不需要添加break语句,该分支的程序运行完成后,会直接跳出switch语句块

可以变相的实现if语句

switch {
case 条件语句 :
    ...
default:
    ...
}


6. 数组

6.1 声明格式

格式 1: var arr_name [len]elem_type 
格式 2: arr_name := [len]elem_type{[e1, e2, e3, ...]} 
        // var arr_name = [len]elem_type{[e1..]} 也可以

6.2 数组遍历

参考格式 1:
for i := 0; i < len(arr_name); i ++ {
    operator(arr_name[i]) 
}

参考格式 2: 使用range
for i, num := range arr_name {
    // i 是索引, val 是对应索引的值
    ...
}

6.3 补充

len(arr_name) // 返回数组元素个数(数组容量)

无初始化元素时,默认数组中元素都是0



7. 切片

变长数组 有些类似于c/c++中的vector

初始化 1: var_name := make([]type, len)
初始化 2: var_name := []type{[e1, e2, ....]}
添加元素: var_name = append(var_name, elem)  //注意,必须要赋值给原来的切片
取出范围元素: var_name[s:e]  //取出切片中 索引在 [s, e) 中的元素,左闭右开


8. map(哈希)

创建 1: map_name := make(map[key_type]val_type) 
// 此处的赋值类似于Python的字典
创建 2: map_name := map[key_type]val_type{key: val, key: val...}  
赋值 key-value对 : map_name[key] = value
删除 key-value对 : delet(map_name, key)

// 若map中存在key的键值对,则val为对应值,ok = true
//反之 val = 0, ok = false
寻值操作  val, ok := map_name[key]


9. 函数

参数的类型是后置的 同python类似,可以有多个返回值

无返回值的函数
func fun_name(a type, b type ..){
    ... 
}

有返回值的函数
func fun_name(a type, b type ..) int {
    ...
    return expr
}

多个返回值
func fun_name(a type, b type ..) (type, type ...) {
    ...
    return c, d
}

接受返回值
var a [, 可能有多个返回值] = fun_name([可能有参数...])


10. 指针

func op(n *int) {
    *n += 2  // 使用具体值的,用 *
}

调用 op(&n)  //等价与 n = n + 2


11. 结构体

11.1 基本操作

type struct_name struct {
    val_name type
    val_name type
    ...
}

初始化
var_name := struct_name{val_name: val, val_name: val}

使用
var_name.val_name  ..

11.2 结构体方法

定义
func (struct_name) fun_name(params ..) return_val {
    ...
}