# Go学习 ### 编写hello world程序 - package 必须是 main - 方法名必须是 main() - 文件名不一定是 main.go ### 和其他语言差异 - Go中 main 函数不支持任何返回值 - 通过os.Exit来返回状态 - main 函数不支持传入参数 - 通过 os.Args 获取命令行参数 ### 编写测试程序 1. 源码文件以 `_test` 结尾: xxx_test.go 2. 测试方法名以 Test 开头: func TestXXX(t *testing.T) {...} ### 变量赋值 - 赋值可以自动进行类型推断 - 在一个赋值语句中可以对多个变量进行同时赋值 ```go // 单独赋值 var a int = 1 var b int = 1 // 同时赋值 var ( a int = 1 b int = 1 ) // 自动推断 a := 1 b := 1 ``` ### 基本数据类型 ```go bool string int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr byte // alias for uint8 rune // alias for int32, represents a Unicode code point float32 float64 complex64 complex128 ``` ### 类型转化 - 与其他编程语言的差异 1. Go不允许隐式类型转换 2. 别名和原有类型也不能进行隐式类型转换 - 类型的预定义值 1. math.MaxInt64 2. math.MaxFloat64 3. math.MaxUint32 ### 算术运算符 - Go语言没有前置的 ++, --, ### 线程和协程 Thread vs. Groutine 1. 创建时默认的 stack (栈) 的大小 - JDK5 以后 Java Thread stack 默认为 1M - Groutine 的 stack 初始化大小为 2k 2. 和 KSE (Kernel Speace Entity) 的对应关系 - Java Thread 是 1:1 - Groutine 是 M:N