Go语言编程-v1.0.0


  Go! why404@七牛云存储 2012/07/21 112年7月21日星期六 What? Godaddy(去你爹, X) Go a head (去个头, X) Golang (Go语言, YES) 212年7月21日星期六 Go a head... 312年7月21日星期六 Golang is ⼀个在语言层面实现了并发机制的类 C 通用型编程语言 412年7月21日星期六 为什么我们需要⼀门新语言 多核时代,硬件更新换代快 软件不能充分利用硬件资源 传统编程语言多核并发编程够繁琐 生产效率 512年7月21日星期六 Go前世今生 1995 Bell Labs, Plan9 -> Inferno (Limbo) 2007/09 Google's 20% project 2008/05 Google full-time project 2009/11 officially announced 2012/03 Go1 Released 612年7月21日星期六 Hello World package main import “fmt” func main() { fmt.Println(“Hello, 世界 ”) } 712年7月21日星期六 Hello World package main import “fmt” func main() { fmt.Println(“Hello, 世界 ”) } export GOROOT=$HOME/go export PATH=$PATH:$GOROOT/bin $ go run hello.go Hello, 世界 812年7月21日星期六 Hello World package main import “fmt” func main() { fmt.Println(“Hello, 世界 ”) } export GOROOT=$HOME/go export PATH=$PATH:$GOROOT/bin $ go build hello.go $ ./hello Hello, 世界 912年7月21日星期六 Go特性小结( 1) 动态语言的写法,静态类型,编译执行 模块化的包管理机制,⼀个脚本即可是⼀个包 包可导出可见成员供包外部使用 Go程序执行首调 main.main() 函数 任何地方都是 UTF-8的包括字符串和程序代码 1012年7月21日星期六 变量 var a int var b string var c bool 1112年7月21日星期六 同时声明多个变量 var a int var b string var c bool var ( a int b string c bool ) 1212年7月21日星期六 声明多个同类型变量 var a int var a1 int var a, a1 int 1312年7月21日星期六 变量声明默认零值初始化 var a int // a = 0 var b string // b = “” var c bool // c = f a l s e 1412年7月21日星期六 变量声明并赋值 var a int = 99 var b string = “hello” var c bool = false var a int var b string var c bool a = 99 b = “hello” c = false 1512年7月21日星期六 变量声明并赋值(简写) var a int = 99 var b string = “hello” var c bool = false a := 99 b := “hello” c := false ( := 仅限函数内使用 ) 1612年7月21日星期六 变量声明且并行赋值 var a, a1 int a, a1 = 99, 100 a, a1 := 99, 100 (:= 仅限函数内使用 ) 1712年7月21日星期六 匿名变量 _ var a, a1 int _, a1 = 99, 100 _, a1 := 99, 100 (将 100赋值给 a1, 同时丢弃 99) 1812年7月21日星期六 声明却未使用的变量 package main func main() { var a string } 对声明却未赋值的变量,会导 致程序编译失败 1912年7月21日星期六 Go特性小结( 2) 变量声明,类型后置,默认零值初始化 同类型的多个变量,可在⼀行内完成声明 函数内支持变量同时声明并赋值 支持多个变量并行赋值 支持匿名变量 Go的静态编译是语法检查的第⼀道单元测试 2012年7月21日星期六 基本类型 bool ( true, false) 数字内型(有符号 /无符号,有长度 /无长度) string(内建 ”UTF-8 string”) array( [n]) slice( array[i:j]) map( map[]) chan error 2112年7月21日星期六 数字类型 无长度 int, uint 有长度 int8, int16, int32, int64 byte/uint8, uint16, uint32, uint64 float32, float64 2212年7月21日星期六 强类型转换( 1) var a int var b int32 a = 99 b = a + 1 // Error b = b + 1 // OK b = int32(a) + 1 // OK 2312年7月21日星期六 强类型转换( 2) var s string = “hello” s[0] = ‘a’ // Error // OK s1 := []byte(s) s1[0] = ‘a’ s2 := string(s1) 字符串⼀旦定义,不可修改。字符串是字 符的序列,不是字节的序列。 2412年7月21日星期六 多行字符串 s1 := “line1 ... ” + “line2 ... ” // o r s2 := `line1 ... line2 ...` 2512年7月21日星期六 常量 常量的值只能是 bool、 string 或数字类 型中的⼀种。常量名大小写无所谓。 const a = 99 // o r const ( a = 99 b string = “hello” // 类型可选传入 ) 2612年7月21日星期六 array 定义方式: [n],值类型 var arr [10]int arr[0] = 1 arr[1] = 2 a1 := [...]{1,2,3} a2 := [2][2]int{ [2]int{1,2}, [2]int{3,4} } a3 := [2][2]int{ [...]int{1,2}, [...]int{3,4} } a4 := [2][2]int{ {1,2}, {3,4} } 2712年7月21日星期六 slice 动态数组,引用类型 var s = make([], n) s := arr[i:j] // == arr[i] - arr[j-1] a := [...]int{1,2,3,4,5} // 序号 0-4 s1 := a[2:4] // 序号 2-3, 返回 3,4 s2 := a[:] // == a[0:len(a)] s3 := a[:4] // == a[0:4] s4 := s1[:] // == s1[0:len(s1)], -> &a 2812年7月21日星期六 slice append s0 := []int{0, 0} s1 := append(s0, 1) // [ ] i n t { 0 , 0 , 1 } s2 := append(s1, s0...) // []int{0, 0, 1, 0, 0} 2912年7月21日星期六 slice copy var a = [...]int{0, 1, 2, 3} var s = make([]int, 2) n1 := copy(s, a[0:]) // n1 == 2, s == []int{0,1} n2 := copy(s, a[2:]) // n2 == 2, s == []int{2,3} 3012年7月21日星期六 map 定义 : map[] 声明 : make(map[]) m := map[string]int{“a”:1, ”b”:2, ”c”:3} // 遍历 for k, v := range m { // ... } 3112年7月21日星期六 map // 查询 v, ok := m [“d”] // v == 0, ok == false // 删除 delete m[“a”] 3212年7月21日星期六 Go特性小结( 3) Go是强类型语言, Duck Type Go内建 string, slice, map 类型 string 是 UTF-8的字符序列,非字节序列 slice 是指针传递而不是像 array值拷贝更高效 3312年7月21日星期六 控制语句 if switch for 支持 break, contine 关键字 3412年7月21日星期六 if if x > 0 { retun y } else { retun x } if err := os.Open(file); err != nil { return err } doSomething(f) 3512年7月21日星期六 switch switch { case [, , ]: // ... case : // ... default: // ... } 3612年7月21日星期六 fallthrough switch i { case 0: case 1: do() // 如果 i == 0该函数不被调用 } switch i { case 0: fallthrough case 1: do() // 如果 i == 0该函数会被调用 } 3712年7月21日星期六 for for init; condition; post { } // 计数循环 for condition { } // while 循环 for { } // for {;;} 死循环 3812年7月21日星期六 for sum := 0 for i := 0; i < 10; i++ { sum +=i } list := []string{"a", "b", "c"} for k, v := range list { // ... } 3912年7月21日星期六 Go特性小结( 4) 简单、清晰的流程控制 只有 if, switch, for 4012年7月21日星期六 函数 func (p T) funcname(i1 T1, i2 T2) (o Tn, err Error){ // return ... } 4112年7月21日星期六 函数 func add(x int, y int) (r int) { r = x + y return } func add(x, y int) int { return x + y } 4212年7月21日星期六 goto func myfunc() { i := 0 Here: fmt.Println(i) i++ goto Here } 4312年7月21日星期六 defer func CopyFile(dstName, srcName string) (written int64, err error) { src, err := os.Open(srcName, os.O_RDONLY, 0) if err != nil { return } defer src.Close() dst, err := os.Open(dstName, os.O_WRONLY|os.O_CREATE, 0644) if err != nil { return } defer dst.Close() return io.Copy(dst, src) } 4412年7月21日星期六 匿名函数(闭包) func c() (i int) { defer func() { i++ }() return 1 } 4512年7月21日星期六 Panic and Recover func check(err error) { !if err != nil { !!panic(err) !} } func safeHandler(fn http.HandlerFunc) http.HandlerFunc { !return func(w http.ResponseWriter, r *http.Request) { !!defer func() { !!!if e, ok := recover().(error); ok { !!!!http.Error(w, e.Error(), http.StatusInternalServerError) !!!!log.Panic("panic fired in %v.panic - %v", fn, e) !!!!log.Panic(string(debug.Stack())) !!!} !!}() !!fn(w, r) !} } mux.HandleFunc("/", safeHandler(func(w http.ResponseWriter, r *http.Request) { app.pageHandler(w, r) })) 4612年7月21日星期六 Go特性小结( 5) Go函数支持命名返回参数,声明较语义化 goto (代码复用) defer (程序安全) 匿名函数 4712年7月21日星期六 结构体( Struct) type Point struct { x, y float64 } var p Point p.x = 123 p.y = 456.78 var p1 *Point = new(Point) *p1 = p p1.x = 123.45 // ( * p 1 ) . x 4812年7月21日星期六 new() vs make() new() 返回指针 t := new(T) make() 返回初始化值 用于创建 slices, maps, channels 4912年7月21日星期六 面向对象 type Point struct { x, y int } func (p *Point) Get() (int, int) { // Public return p.x, p.y } func (p *Point) Put(x, y int) { // Public p.x = x p.y = y } func (p *Point) add(x, y int) int { // p r i v a t e return p.x + p.y } 5012年7月21日星期六 模拟继承 type YetAnotherPointer struct { Point // 匿名字段 z int } func (p *YetAnotherPointer) Get() (int, int, int) { return p.x, p.y, p.z } m := YetAnotherPointer{Pointer{1,2}, 3} fmt.Println(m.Get()) 5112年7月21日星期六 接口 type Pointer interface { Get() (int, int) Put(x, y int) } type Point struct { x, y int } func (p *Point) Get() (int, int) { return p.x, p.y } func (p *Point) Put(x, y int) { p.x = x p.y = y } 5212年7月21日星期六 Goroutine( 1) func ready(w string, sec int64) { secs := time.Duration(sec)*time.Second time.Sleep(secs) fmt.Println(w, "is ready!") } func main(){ go ready("Tee", 2) go ready("Coffee", 1) fmt.Println("I'm waiting") secs := time.Duration(sec)*time.Second time.Sleep(5 * secs) } Output: I'm waiting // 立刻 Coffee is ready // 1秒后 Tee is ready // 2秒后 5312年7月21日星期六 Goroutine( 2) Goroutines 缺省是并发执行的,但不是并行运 行的,同⼀时刻只有⼀个 goroutine执行。 runtime.GOMAXPROCS(n) GOMAXPROCS environment varaible 5412年7月21日星期六 Channel c := make(chan int) c <- 1 // 发送整数 1 到 channel c <-c // 从 channel c接值,并丢弃 i := <-c // 接值,并初始化赋值给变量 i 5512年7月21日星期六 Channel var c chan int func ready(w string, sec int64) { secs := time.Duration(sec)*time.Second time.Sleep(secs) fmt.Println(w, "is ready!") c <- 1 } func main() { c = make(chan int) go ready("Tee", 2) go ready("Coffee", 1) fmt.Println("I'm waiting") ret := <-c ret = <-c } 5612年7月21日星期六 More... 5712年7月21日星期六 Q & A @飞天急速徐倒立 awhy.xu@gmail.com 5812年7月21日星期六
还剩58页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

霸气虎风

贡献于2012-10-19

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf