Skip to content
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为trueif x := recover(); x != nil { 
      b = true
    } }()
  f() //调用作为参数接收的函数
  return //返回 b 的值. 由于 b 是命名返回值, 无须指定 
}
  • 指针
new(T) 返回 *T 指向一个零值 T
make(T) 返回初始化后的T
make 仅适用于 slice, map  channel
  • 指针++
*p++  --->  (*p)++
此处++仅能工作于指向数字的指针值
因为++仅仅定义在数字类型上
同时, Go中没有运算符重载, 所以在其它类型上会报错
Clone this wiki locally