標籤:文檔 數組 socket 多核 return 規範 opened 簡單的 http服務
第1章 初識Go語言
1.1 語言簡史
1.2 語言特性
1.2.1 自動記憶體回收
1.2.2 更豐富的內建類型
1.2.3 函數多傳回值
1.2.4 錯誤處理
1.2.5 匿名函數和閉包
1.2.6 類型和介面
1.2.7 並發編程
package mainimport "fmt"func sum(values []int,resultChan chan int) { sum := 0 for _,value := range values { sum += value } resultChan <- sum}func main() { values := []int {1,2,3,4,5,6,7,8,9,10} resultChan := make(chan int,2) go sum(values[:len(values)/2],resultChan) go sum(values[len(values)/2:],resultChan) sum1,sum2 := <-resultChan,<-resultChan fmt.Println("Result:",sum1,sum2,sum1+sum2)}
paracalc
1.2.8 反射
package mainimport ( "fmt" "reflect")type Bird struct { Name string LifeExpectance int}func (b *Bird) Fly() { fmt.Println("I am flying...")}func main() { sparrow := &Bird{"Sparrow",3} s := reflect.ValueOf(sparrow).Elem() typeOfT := s.Type() for i := 0; i < s.NumField(); i++ { f := s.Field(i) fmt.Printf("%d: %s %s = %v\n",i,typeOfT.Field(i).Name,f.Type(),f.Interface()) }}
reflect
1.2.9 語言互動性
package main/*#include <stdio.h>*/import "C"import "unsafe"func main() { cstr := C.CString("Hello,World") C.puts(cstr) C.free(unsafe.Pointer(cstr))}
cprint
1.3 第一個Go程式
package mainimport "fmt"func main() { fmt.Println("Hello,World")}
Hello World
1.3.1 代碼解讀
1.3.2 編譯環境準備
$go version
1.3.3 編譯器
1.4 開發工具選擇
1.5 工程管理
package mainimport "os"import "fmt"import "simplemath"import "strconv"var Usage = func() { fmt.Println("USAGE: calc command [arguments] ...") fmt.Println("\nThe commands are:\n\tadd\tAddition of two values.\n\tsqrt\tSquare root of a non-negative value.")}func main() { args := os.Args if args == nil || len(args) < 2 { Usage() return } switch args[0] { case "add": if len(args) != 3 { fmt.Println("USAGE: cacl add <integer1><integer2>") return } v1,err1 := strconv.Atoi(args[1]) v2,err2 := strconv.Atoi(args[2]) if err1 != nil || err2 != nil { fmt.Println("USAGE: calc add<integer1><integer2>") return } ret := simplemath.Add(v1,v2) fmt.Println("Result: ",ret) case "sqrt": if len(args) != 2 { fmt.Println("USAGE: calc sqrt <integer>") return } v,err := strconv.Atoi(args[1]) if err != nil { fmt.Println("USAGE: calc sqrt <integer>") return } ret := simplemath.Sqrt(v) fmt.Println("Result: ",ret) default: Usage() }}
calcl
package simplemathfunc Add(a int,b int) int { return a + b}
add
package simplemathimport "testing"func TestAdd1(t *testing.T) { r := Add(1,2) if r != 3 { t.Errorf("Add(1,2) failed.Got %d,expected 3.",r) }}
add_test
package simplemathimport "math"func Sqrt(i int) int { v := math.Sqrt(float64(i)) return int(v)}
sqrt
package simplemathimport "testing"func TestSqrt1(t *testing.T) { v := Sqrt(16) if v != 4 { t.Errorf("Sqrt(16) failed.Got %v,expected 4.",v) }}
sqrt_test
1.6 問題追蹤和調試
1.6.1 列印日誌
1.6.2 GDB調試
1.7 如何尋求協助
1.7.1 郵件清單
1.7.2 網站資源
1.8 小結
第2章 順序編程
2.1 變數
2.1.1 變數聲明
2.1.2 變數初始化
2.1.3 變數賦值
2.1.4 匿名變數
2.2 常量
2.2.1 字面常量
2.2.2 常量定義
2.2.3 預定義常量
2.2.4 枚舉
2.3 類型
2.3.1 布爾類型
2.3.2 整型
2.3.3 浮點型
2.3.4 複數類型
2.3.5 字串
2.3.6 字元類型
2.3.7 數組
2.3.8 數組切片
2.3.9 map
2.4 流程式控制制
2.4.1 條件陳述式
2.4.2 選擇語句
2.4.3 迴圈語句
2.4.4 跳躍陳述式
2.5 函數
2.5.1 函數定義
2.5.2 函數調用
2.5.3 不定參數
2.5.4 多傳回值
2.6 錯誤處理
2.6.1 error介面
2.6.2 defer
2.6.3 panic()和recover()
2.7 完整樣本
2.7.1 程式結構
2.7.2 主程式
2.7.3 演算法實現
2.7.4 主程式
2.7.5 構建與執行
2.8 小結
第3章 物件導向編程
3.1 類型系統
3.1.1 為類型添加方法
3.1.2 值語義和引用語義
3.1.3 結構體
3.2 初始化
3.3 匿名組合
3.4 可見度
3.5 介面
3.5.1 其他語言的介面
3.5.2 非侵入式介面
3.5.3 介面賦值
3.5.4 介面查詢
3.5.5 類型查詢
3.5.6 介面組合
3.5.7 Any類型
3.6 完整樣本
3.6.1 音樂庫
3.6.2 音樂播放
3.6.3 主程式
3.6.4 構建運行
3.6.5 遺留問題
3.7 小結
第4章 並發編程
4.1 並發基礎
4.2 協程
4.3 goroutine
4.4 並發通訊
4.5 channel
4.5.1 基本文法
4.5.2 select
4.5.3 緩衝機制
4.5.4 逾時機制
4.5.5 channel的傳遞
4.5.6 單向channel
4.5.7 關閉channel
4.6 多核並行化
4.7 出讓時間片
4.8 同步
4.8.1 同步鎖
4.8.2 全域唯一性操作
4.9 完整樣本
4.9.1 簡單IPC架構
4.9.2 中央伺服器
4.9.3 主程式
4.9.4 運行小程式
4.10 小結
第5章 網路編程
5.1 Socket編程
5.1.1 Dial()函數
5.1.2 ICMP樣本程式
5.1.3 TCP樣本程式
5.1.4 更豐富的網路通訊
5.2 HTTP編程
5.2.1 HTTP用戶端
5.2.2 HTTP服務端
5.3 RPC編程
5.3.1 Go語言中的RPC支援與處理
5.3.2 Gob簡介
5.3.3 設計優雅的RPC介面
5.4 JSON處理
5.4.1 編碼為JSON格式
5.4.2 解碼JSON資料
5.4.3 解碼未知結構的JSON資料
5.4.4 JSON的流式讀寫
5.5 網站開發
5.5.1 最簡單的網站程式
5.5.2 net/http包簡介
5.5.3 開發一個簡單的相簿網站
5.6 小結
第6章 安全編程
6.1 資料加密
6.2 數位簽章
6.3 數位憑證
6.4 PKI體系
6.5 Go語言的雜湊函數
6.6 加密通道
6.6.1 加密通訊流程
6.6.2 支援HTTPS的Web伺服器
6.6.3 支援HTTPS的檔案伺服器
6.6.4 基於SSL/TLS的ECHO程式
6.7 小結
第7章 工程管理
7.1 Go命令列工具
7.2 代碼風格
7.2.1 強制性編碼規範
7.2.2 非強制性編碼風格建議
7.3 遠程import支援
7.4 工程組織
7.4.1 GOPATH
7.4.2 目錄結構
7.5 文件管理
7.6 工程構建
7.7 跨平台開發
7.7.1 交叉編譯
7.7.2 Android支援
7.8 單元測試
7.9 打包分發
7.10 小結
第8章 開發工具
8.1 選擇開發工具
8.2 gedit
8.2.1 文法高亮
8.2.2 編譯環境
8.3 Vim
8.4 Eclipse
8.5 Notepad++
8.5.1 文法高亮
8.5.2 編譯環境
8.6 LitelIDE
8.7 小結
第9章 進階話題
9.1 反射
9.1.1 基本概念
9.1.2 基本用法
9.1.3 對結構的反射操作
9.2 語言互動性
9.2.1 類型映射
9.2.2 字串映射
9.2.3 C程式
9.2.4 函數調用
9.2.5 編譯Cgo
9.3 連結符號
9.4 goroutine機理
9.4.1 攜程
9.4.2 攜程的C語言實現
9.4.3 協程庫概述
9.4.4 任務
9.4.5 任務調度
9.4.6 環境切換
9.4.7 通訊機制
9.5 介面機理
9.5.1 類型賦值給介面
9.5.2 介面查詢
9.5.3 介面賦值
Go語言編程