go语言入门
发布:2020年3月16日      更新:2020年5月13日

go语法学习

菜鸟教程

hollo world

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Println("Hello, World!")
}

编译

1
go build hello.go

运行

1
2
3
go run hello.go 

./hello

go基本语法

go语言类型

go变量

1
2
3
var identifier type
var v_name = value
v_name := value

零值: 变量没有初始化的默认值
:= 声明语句
值类型和引用类型: &i(i变量的内存地址)

go 常量

1
2
3
4
5
6
7
8
9
10
11
const identifier [type] = value

const b string = "abc"
const b = "abc"

枚举
const (
a
b = 1
c ="ss"
)

特殊常量 iota : const 后每一行自动+1

go 运算符

同其他语言
特别的有

go 条件运算

go 循环语句

for

1
2
3
4
5
6
7
for key, value := range oldMap { }

for init; condition; post { }

for condition { }

for { }

goto

1
2
3
4
goto label;
..
.
label: statement;

go 函数

go 变量作用域

go 数组

声明:

1
var variable_name [SIZE] variable_type

初始化

1
2
3
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
balance[4] = 50.0

多维数组

1
var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type

go 指针

指针使用流程:

空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。

Go 支持指向指针的指针

go 结构体

跟java的modal一个意思
定义

1
2
3
4
5
6
type struct_variable_type struct {
member definition
member definition
...
member definition
}

结构体用于用于变量的声明

1
2
3
variable_name := structure_variable_type {value1, value2...valuen}

variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}

访问: 结构体.成员名”

go 切片

Go 语言切片是对数组的抽象。与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

切片定义[]

初始化 类似python

函数

一个切片在未初始化之前默认为 nil,长度为 0

go 范围(Range)

Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。
类似迭代

for k, v := range kvs

go 集合

1
2
3
4
5
/* 声明变量,默认 map 是 nil */
var map_variable map[key_data_type]value_data_type

/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)

go 接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* 定义接口 */
type interface_name interface {
method_name1 [return_type]
method_name2 [return_type]
method_name3 [return_type]
...
method_namen [return_type]
}

/* 定义结构体 */
type struct_name struct {
/* variables */
}

/* 实现接口方法 */
func (struct_name_variable struct_name) method_name1() [return_type] {
/* 方法实现 */
}
...
func (struct_name_variable struct_name) method_namen() [return_type] {
/* 方法实现*/
}

go 错误处理

抛出错误: errors.New(“math: square root of negative number”)

go 并发

1
2
3
4
5
6
7
8
9
ch := make(chan int) // 声明通道

v := <- ch // 从ch 接收数据

ch <- v //发送给通道

ch := make(chan int, 100) // 设置通道缓冲区

v, ok := <-ch // 遍历通道 如没有数据后ok为false