Golang复习笔记
Golang复习笔记
1: intro
Golang: 极简单的部署方式
- 可直接编译成机器码
- 不依赖其它库
- 直接运行可部署
Golang是一门静态类型语言 -- 编译时可检查出隐藏的问题
语言层面的并发
- 天生支持并发
- 充分利用多核
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18package main
import (
"fmt"
"time"
)
func goFunc(i int) {
fmt.Println("goroutine ", i, " ...")
}
func main() {
for i := 0; i < 10000; i++ {
go goFunc(i) // 开启一个并发协程
}
time.Sleep(time.Second)
}强大的标准库
- runtime系统调度机制
- 高效的GC (垃圾回收)
- 丰富的标准库
简单易学
- 25个关键字
- 内嵌C语法支持
- 面向对象
- 跨平台
Golang的强项
- 云计算基础设施
- 基础后端软件
- 微服务
- 互联网基础设施
Golang的不足
- 包管理, 大部分包都在Github上
- 所有的Exception都用Error处理 (没有try-catch)
- 对C的降级处理并非无缝, 没有C降级到asm那么完美 (例如序列化问题)
2: basic feature
package main
表示一个可独立执行的程序, 每个 Go 应用程序都包含一个名为 main 的包.golang中的表达式, 末尾的分号
;
可加可不加, 建议不加.import "fmt"
表示导入fmt包, fmt包里包含了格式化IO的函数.main函数式每一个可执行程序必须包含的.
注释, 类似C语言,
//
单行注释;/* ... */
块注释.fmt.Println(...)
与fmt.Print(...)
格式化输出.fmt.Scanln(...)
与fmt.Scanf(...)
格式化输入.Print
类似python的语法, 而Printf
类似C语言的用法.变量声明: 使用
var
关键字- 指定变量类型, 若声明后不赋值, 默认值为0:
1
var a int
- 根据值自行判定变量类型:
1
var v_name = value
使用
:=
, 注意,:=
左边的变量不能是已经声明过的多变量声明:
1
2
3
4
5
6
7var ( // 这种写法一般用于全局变量
a int
b bool
)
var c, d int
var e, f = 123, "str"
result, err := funcCall()常量使用
const
关键字定义, 格式为:const identifier [type] = value
, type可以省略, 由编译器进行类型推断.常量的值必须是能够在编译期确定, 如:
1
2const c1 = 1 * 2 + 3; // √
const c2 = getRes(); // x
在编译期, 自定义函数不可作为常量的赋值, 但是内置函数可以, 如:
len()
数字型的常量是没有大小和符号的, 并且可以使用任何精度而不会导致溢出. (但是如果将常量赋值给某个特定类型变量, 则可能出现溢出)
常量可以用作枚举:
1
2
3
4
5
6
7const (
Mon, Tue, Wed = 1, 2, 3
)
const (
Female = 1
Male = 2
)也可以利用golang里面的常量计数器
iota
, 每当const关键字出现时, 计数器清零, 然后按行常量声明值自增1.以下是关于
itoa
的语法细节:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19/* 一行多个itoa */
const (
a, b = iota, iota // a = b = 0
c, d // c = d = 0
)
/* 跳值占位 */
const (
a = iota // a = 0
_
b // b = 2
)
/* 首行或中间插队 */
const (
a = 99
b = iota // b = 1
c = 97
d = iota // d = 3
e // 没有表达式的常量定义复用上一行的表达式
)init
函数: 一类特殊的函数, 不能被人为调用, 而是在每个包完成初始化后自动按包的依赖关系顺序执行.可以在
init
函数中对变量初始化.