Go 语法概览 Part 2

这是 Go 学习笔记的第二篇,继续对 Go 的语法进行一个概览,你可以在这里看到第一篇。

本篇将聚焦于 Go 语言的数组,切片,字典以及函数。

1 数组

Array(数组)是一个由数个相同类型的元素构成的序列。例如:

1
var stds [4]string = [4]string{"a","b","c","d"}

数组的长度是数组类型的一部分。拥有相同元素类型的数组,如果长度不同,那么就不是相同的数组。数组的长度一经声明,就不可以再改变了。

声明语句的右半部分也可以这么写:

1
[...]string{"a","b","c","d"} // Go 编译器将计算元素的数量,并获得长度

2 切片

slice(切片)对数组的一种包装形式,被它包装的数组被叫做切片的底层数组。它表述了底层数组中的一个连续片段。

声明形式如下:

1
var stds = []string{"a","b","c","d"}

切片的类型不包含长度信息,因此拥有相同元素类型的切片,他们的类型就是相同的。

切片的长度可变,零值为 nil,当处于零值时,长度和容量都是0。其中,切片的容量是指在没有更换底层数组时长度的最大值。

切片的初始化可以通过内建函数 make 进行,通过使用 make 能以很短的代码初始化一个长度很大的切片。

如:

1
stds := make([]string, 100)

3 字典

map(字典)是 hash table 的一个实现。map 是 key-value 形式元素对的一个无序集合。map 中的每个索引都是独一无二的。

map 的声明如下所示:

1
var mStds = map[string]string{}

map 的零值为 nil,零值的长度是 0。map 的长度表明了其中所含有的 key-value 对的数量。

map 数据的添加与修改

1
mStds["a"] = "1"

删除

1
delete(mStds, "a") // 无论是否存在 “a“, 都将会执行完毕。

查询

1
value, has := mStds["a"]

4 函数

函数在 Go 中是作为一等公民形式存在的,可以将函数作为一个值来传递和使用。

一个函数的声明通常包括关键字 func, 函数名,由圆括号包围的参数列表和结果列表,以及花括号包围的函数体。如下:

1
2
3
func A(a int, b int)(res int, err error) {
return
}

为了辨别不同的函数,需要使用函数签名,函数签名是函数参数列表以及结果列表的统称。函数签名不包括参数和结果的名称。

如果两个函数参数列表和结果列表的顺序以及类型相同,那么,这两个函数实现了同一个函数类型。

函数也可以用来实现闭包。所谓闭包,就是将某个函数类型作为闭包函数的一个参数,在调用时根据需求传动态传入函数,产生不同的行为。闭包函数在定义时并不会知道某个函数类型的具体实现,只有在调用时才会知道。如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package main

import (
"errors"
"fmt"
)

type operate func(x, y int) int
type calculateFunc func(x, y int) (int, error)

func genCalculater(op operate) calculateFunc {
return func(x, y int) (int, error) {
if op == nil {
return 0, errors.New("invalid operation")
}
return op(x, y), nil
}
}

func main() {
x, y := 5, 7
op := func(x, y int) int {
return x * y
}
mult := genCalculater(op) // 生成乘法运算函数
result, err := mult(x, y)
fmt.Printf("result: %d (error: %v)\n", result, err)

op2 := func(x, y int) int {
return x + y
}

add := genCalculater(op2) // 生成加法运算函数
result, err = add(x, y)
fmt.Printf("result: %d (error: %v)\n", result, err)

}

Go 语法概览 Part 2
https://blog.zhangliangliang.cc/post/Go-grammar-overview-2.html
作者
Bobby Zhang
发布于
2019年4月8日
许可协议