-
Notifications
You must be signed in to change notification settings - Fork 0
语言学习
lenville edited this page Feb 3, 2015
·
11 revisions
在学习之前可以看一下许式伟老师的这个PPT
虽然看大家评论说 许老师的书 (还有翻译的书) 写的不是太好, 但是一些精髓还是能 Get√ 到的 这里 还有一些很棒的资料, 可以参考
入门推荐: <学习Go语言> 中文版 作者
- Go支持全局UTF-8
- Go变量类型后置
var a int
- 声明赋值操作符
:=
a := 15
- 一个特殊的变量名是 _(下划线)。任何赋给它的值都被丢弃。
b, _ := 34, 35
- 完整的整数类型列表(符号和无符号)是 int8, int16, int32, int64 和 byte, uint8, uint16, uint32, uint64. byte 是 uint8 的别名. 浮点类型的值有 float32 和 float64 (没有 float 类 型). 64 位的整数和浮点数总是 64 位的, 即便是在 32 位的架构上.
- 可以使用 iota c 生成枚举值, 第一个 iota 表示为 0, 当 iota 再次在新的一行使用时, 它的值增加 1. 单词 iota 在日常英语短语 “not one iota”,意思是 “不是最小”.
- "" 为字符串, '' 为字符, Golang中修改字符串需要转换为数组
s := "hello"
c := []rune(s) //转换 s 为 rune 数组
c[0] = 'c' //修改数组的第一个元素
s2 := string(c) //创建新的字符串 s2 保存修改
fmt.Printf("%s\n", s2)
- 使用反引号 ` 作为原始字符串符号, 原始字符串标识的值在引号内的字符不转义
- Rune 是 int32 的别名, 这个类型在什么时候使用呢? 例如需要遍历字符串中的字符. 可以循环每个字节(仅在使用 US ASCII 编码字符串时与字符等价, 而它们在 Go 中不存在!). 因此为了获得实际的字符, 需要使用 rune 类型
- Go 原生支持复数。它的变量类型是 complex128 (64 位虚数部分)。如果需要小一些的,还有 complex64 – 32 位的虚数部分。复数写为 re + imi,re 是实数部分,im 是虚数部分,而 i 是标记 ’i’ (√−1)。使用复数的一个例子:
var c complex64 = 5+5i;
fmt.Printf("Value is: %v", c) //将会打印: (5+5i)
- 由于 Go 没有逗号表达式, 而 ++ 和 – 是语句而不是表达式, 如果你想在 for 中执行多个变量, 应当使用 平行赋值.
// Reverse a
fo r i, j := 0, len(a)-1 ; i < j ; i, j = i+1, j-1 {
a[i], a[j] = a[j], a[i] //平行赋值
}
- 检查元素是否存在, 可以使用下面的方式
var value int
var present bool
value, present = monthdays["Jan"] ← 如果存在,present 则有值 true ← 或者更接近 Go 的方式
v, ok := monthdays["Jan"] ← “逗号 ok”形式
- Go函数的定义
func (p mytype) funcname(q int) (r,s int) { return 0,0 }
func //关键字 func 用于定义一个函数
(p mytype) //函数可以绑定到特定的类型上. 这叫做 接收者. 有接收者的函数被称作 method.
funcname //函数的名字
(q int) //int类型的变量q作为输入参数. 参数用pass-by-value方式传递, 意味着它们会被复制
(r,s int) //变量 r 和 s 是这个函数的命名返回值. 在 Go 的函数中可以返回多个值. 如果不想对返回的参数命名, 只需要提供类型:(int,int) 如果只有一个返回值, 可以省略圆括号. 如果函数是一个子过程, 并且没有任何 返回值, 也可以省略这些内容
{ return 0,0 } 这是函数体. return 是一个语句,所以包裹参数的括号是可选的。
-
defer
非常强大 可以指定函数在退出时执行的语句, 延迟的函数是按照后进先出(LIFO)的顺序执行
func f()(ret int) {
ret = 0
defer func() {
ret++
}()
return ret //返回的当然是 1 啦
}
- Go函数接受变参
func myfunc(arg ...int) { }
, 变量 arg 是一个 int 类型的 slice
for _, n := range arg {
fmt.Printf("And the number is: %d\n", n)
}
- 恐慌(Panic)和恢复(Recover)
Panic
是一个内建函数,可以中断原有的控制流程,进入一个令人恐慌的流程中。当函 数 F 调用 panic,函数 F 的执行被中断,并且 F 中的延迟函数会正常执行,然 后 F 返回到调用它的地方。在调用的地方,F 的行为就像调用了 panic。这一过 程继续向上,直到程序崩溃时的所有 goroutine 返回。
恐慌可以直接调用 panic 产生。也可以由运行时错误产生,例如访问越界的数 组。
Recover
是一个内建的函数,可以让进入令人恐慌的流程中的 goroutine 恢复过来。recover 仅在延迟函数中有效。
在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果。如果 当前的 goroutine 陷入恐慌,调用 recover 可以捕获到 panic 的输入值,并且恢 复正常的执行。
func throwsPanic(f func()) (b bool) {
//定义一个新函数 throwsPanic 接受一个函数作为参数. 函数f产生panic, 就返回 true,否则返回 false;
defer func() {
//定义一个利用recover的defer函数. 如果当前的goroutine产生panic, 这个defer函数能够发现. 当recover()返回非nil值,设置b为true
 if x := recover(); x != nil {
b = true
} }()
f() //调用作为参数接收的函数
return //返回 b 的值. 由于 b 是命名返回值, 无须指定
}
- 指针
new(T) 返回 *T 指向一个零值 T
make(T) 返回初始化后的T
make 仅适用于 slice, map 和 channel
- 指针++
*p++ ---> (*p)++
此处++仅能工作于指向数字的指针值
因为++仅仅定义在数字类型上
同时, Go中没有运算符重载, 所以在其它类型上会报错