2015-12-09 07:57:17 +00:00
<!DOCTYPE HTML>
< html lang = "zh-tw" >
< head >
< meta charset = "UTF-8" >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" / >
2015-12-31 08:20:27 +00:00
< title > 工具 | Go语言圣经< / title >
2015-12-09 07:57:17 +00:00
< meta content = "text/html; charset=utf-8" http-equiv = "Content-Type" >
< meta name = "description" content = "" >
2016-01-02 08:04:45 +00:00
< meta name = "generator" content = "GitBook 2.6.6" >
2015-12-09 07:57:17 +00:00
< meta name = "HandheldFriendly" content = "true" / >
< meta name = "viewport" content = "width=device-width, initial-scale=1, user-scalable=no" >
< meta name = "apple-mobile-web-app-capable" content = "yes" >
< meta name = "apple-mobile-web-app-status-bar-style" content = "black" >
< link rel = "apple-touch-icon-precomposed" sizes = "152x152" href = "../gitbook/images/apple-touch-icon-precomposed-152.png" >
< link rel = "shortcut icon" href = "../gitbook/images/favicon.ico" type = "image/x-icon" >
< link rel = "stylesheet" href = "../gitbook/style.css" >
2015-12-28 08:08:26 +00:00
< link rel = "stylesheet" href = "../gitbook/plugins/gitbook-plugin-katex/katex.min.css" >
2015-12-09 07:57:17 +00:00
< link rel = "stylesheet" href = "../gitbook/plugins/gitbook-plugin-highlight/website.css" >
< link rel = "stylesheet" href = "../gitbook/plugins/gitbook-plugin-fontsettings/website.css" >
< link rel = "next" href = "../ch11/ch11.html" / >
< link rel = "prev" href = "../ch10/ch10-06.html" / >
< / head >
< body >
2016-01-02 08:04:45 +00:00
< div class = "book"
data-level="10.7"
data-chapter-title="工具"
data-filepath="ch10/ch10-07.md"
data-basepath=".."
data-revision="Sat Jan 02 2016 16:00:23 GMT+0800 (中国标准时间)"
data-innerlanguage="">
2015-12-09 07:57:17 +00:00
< div class = "book-summary" >
< nav role = "navigation" >
< ul class = "summary" >
< li class = "chapter " data-level = "0" data-path = "index.html" >
< a href = "../index.html" >
< i class = "fa fa-check" > < / i >
前言
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "0.1" data-path = "ch0/ch0-01.html" >
< a href = "../ch0/ch0-01.html" >
< i class = "fa fa-check" > < / i >
< b > 0.1.< / b >
Go語言起源
< / a >
< / li >
< li class = "chapter " data-level = "0.2" data-path = "ch0/ch0-02.html" >
< a href = "../ch0/ch0-02.html" >
< i class = "fa fa-check" > < / i >
< b > 0.2.< / b >
Go語言項目
< / a >
< / li >
< li class = "chapter " data-level = "0.3" data-path = "ch0/ch0-03.html" >
< a href = "../ch0/ch0-03.html" >
< i class = "fa fa-check" > < / i >
< b > 0.3.< / b >
本書的組織
< / a >
< / li >
< li class = "chapter " data-level = "0.4" data-path = "ch0/ch0-04.html" >
< a href = "../ch0/ch0-04.html" >
< i class = "fa fa-check" > < / i >
< b > 0.4.< / b >
更多的信息
< / a >
< / li >
< li class = "chapter " data-level = "0.5" data-path = "ch0/ch0-05.html" >
< a href = "../ch0/ch0-05.html" >
< i class = "fa fa-check" > < / i >
< b > 0.5.< / b >
2015-12-21 04:55:18 +00:00
致謝
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "1" data-path = "ch1/ch1.html" >
< a href = "../ch1/ch1.html" >
< i class = "fa fa-check" > < / i >
< b > 1.< / b >
入門
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "1.1" data-path = "ch1/ch1-01.html" >
< a href = "../ch1/ch1-01.html" >
< i class = "fa fa-check" > < / i >
< b > 1.1.< / b >
Hello, World
< / a >
< / li >
< li class = "chapter " data-level = "1.2" data-path = "ch1/ch1-02.html" >
< a href = "../ch1/ch1-02.html" >
< i class = "fa fa-check" > < / i >
< b > 1.2.< / b >
命令行參數
< / a >
< / li >
< li class = "chapter " data-level = "1.3" data-path = "ch1/ch1-03.html" >
< a href = "../ch1/ch1-03.html" >
< i class = "fa fa-check" > < / i >
< b > 1.3.< / b >
2015-12-21 04:55:18 +00:00
査找重複的行
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "1.4" data-path = "ch1/ch1-04.html" >
< a href = "../ch1/ch1-04.html" >
< i class = "fa fa-check" > < / i >
< b > 1.4.< / b >
2015-12-21 04:55:18 +00:00
GIF動畵
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "1.5" data-path = "ch1/ch1-05.html" >
< a href = "../ch1/ch1-05.html" >
< i class = "fa fa-check" > < / i >
< b > 1.5.< / b >
2015-12-28 08:08:26 +00:00
獲取URL
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "1.6" data-path = "ch1/ch1-06.html" >
< a href = "../ch1/ch1-06.html" >
< i class = "fa fa-check" > < / i >
< b > 1.6.< / b >
2015-12-28 08:08:26 +00:00
併發獲取多個URL
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "1.7" data-path = "ch1/ch1-07.html" >
< a href = "../ch1/ch1-07.html" >
< i class = "fa fa-check" > < / i >
< b > 1.7.< / b >
Web服務
< / a >
< / li >
< li class = "chapter " data-level = "1.8" data-path = "ch1/ch1-08.html" >
< a href = "../ch1/ch1-08.html" >
< i class = "fa fa-check" > < / i >
< b > 1.8.< / b >
本章要點
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "2" data-path = "ch2/ch2.html" >
< a href = "../ch2/ch2.html" >
< i class = "fa fa-check" > < / i >
< b > 2.< / b >
程序結構
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "2.1" data-path = "ch2/ch2-01.html" >
< a href = "../ch2/ch2-01.html" >
< i class = "fa fa-check" > < / i >
< b > 2.1.< / b >
命名
< / a >
< / li >
< li class = "chapter " data-level = "2.2" data-path = "ch2/ch2-02.html" >
< a href = "../ch2/ch2-02.html" >
< i class = "fa fa-check" > < / i >
< b > 2.2.< / b >
聲明
< / a >
< / li >
< li class = "chapter " data-level = "2.3" data-path = "ch2/ch2-03.html" >
< a href = "../ch2/ch2-03.html" >
< i class = "fa fa-check" > < / i >
< b > 2.3.< / b >
變量
< / a >
< / li >
< li class = "chapter " data-level = "2.4" data-path = "ch2/ch2-04.html" >
< a href = "../ch2/ch2-04.html" >
< i class = "fa fa-check" > < / i >
< b > 2.4.< / b >
賦值
< / a >
< / li >
< li class = "chapter " data-level = "2.5" data-path = "ch2/ch2-05.html" >
< a href = "../ch2/ch2-05.html" >
< i class = "fa fa-check" > < / i >
< b > 2.5.< / b >
類型
< / a >
< / li >
< li class = "chapter " data-level = "2.6" data-path = "ch2/ch2-06.html" >
< a href = "../ch2/ch2-06.html" >
< i class = "fa fa-check" > < / i >
< b > 2.6.< / b >
包和文件
< / a >
< / li >
< li class = "chapter " data-level = "2.7" data-path = "ch2/ch2-07.html" >
< a href = "../ch2/ch2-07.html" >
< i class = "fa fa-check" > < / i >
< b > 2.7.< / b >
作用域
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "3" data-path = "ch3/ch3.html" >
< a href = "../ch3/ch3.html" >
< i class = "fa fa-check" > < / i >
< b > 3.< / b >
基礎數據類型
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "3.1" data-path = "ch3/ch3-01.html" >
< a href = "../ch3/ch3-01.html" >
< i class = "fa fa-check" > < / i >
< b > 3.1.< / b >
整型
< / a >
< / li >
< li class = "chapter " data-level = "3.2" data-path = "ch3/ch3-02.html" >
< a href = "../ch3/ch3-02.html" >
< i class = "fa fa-check" > < / i >
< b > 3.2.< / b >
浮點數
< / a >
< / li >
< li class = "chapter " data-level = "3.3" data-path = "ch3/ch3-03.html" >
< a href = "../ch3/ch3-03.html" >
< i class = "fa fa-check" > < / i >
< b > 3.3.< / b >
2015-12-21 04:55:18 +00:00
複數
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "3.4" data-path = "ch3/ch3-04.html" >
< a href = "../ch3/ch3-04.html" >
< i class = "fa fa-check" > < / i >
< b > 3.4.< / b >
2015-12-21 04:55:18 +00:00
布爾型
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "3.5" data-path = "ch3/ch3-05.html" >
< a href = "../ch3/ch3-05.html" >
< i class = "fa fa-check" > < / i >
< b > 3.5.< / b >
字符串
< / a >
< / li >
< li class = "chapter " data-level = "3.6" data-path = "ch3/ch3-06.html" >
< a href = "../ch3/ch3-06.html" >
< i class = "fa fa-check" > < / i >
< b > 3.6.< / b >
常量
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "4" data-path = "ch4/ch4.html" >
< a href = "../ch4/ch4.html" >
< i class = "fa fa-check" > < / i >
< b > 4.< / b >
2015-12-21 04:55:18 +00:00
複合數據類型
2015-12-09 07:57:17 +00:00
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "4.1" data-path = "ch4/ch4-01.html" >
< a href = "../ch4/ch4-01.html" >
< i class = "fa fa-check" > < / i >
< b > 4.1.< / b >
數組
< / a >
< / li >
< li class = "chapter " data-level = "4.2" data-path = "ch4/ch4-02.html" >
< a href = "../ch4/ch4-02.html" >
< i class = "fa fa-check" > < / i >
< b > 4.2.< / b >
2015-12-31 08:20:27 +00:00
Slice
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "4.3" data-path = "ch4/ch4-03.html" >
< a href = "../ch4/ch4-03.html" >
< i class = "fa fa-check" > < / i >
< b > 4.3.< / b >
2015-12-31 08:20:27 +00:00
Map
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "4.4" data-path = "ch4/ch4-04.html" >
< a href = "../ch4/ch4-04.html" >
< i class = "fa fa-check" > < / i >
< b > 4.4.< / b >
結構體
< / a >
< / li >
< li class = "chapter " data-level = "4.5" data-path = "ch4/ch4-05.html" >
< a href = "../ch4/ch4-05.html" >
< i class = "fa fa-check" > < / i >
< b > 4.5.< / b >
JSON
< / a >
< / li >
< li class = "chapter " data-level = "4.6" data-path = "ch4/ch4-06.html" >
< a href = "../ch4/ch4-06.html" >
< i class = "fa fa-check" > < / i >
< b > 4.6.< / b >
文本和HTML模闆
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "5" data-path = "ch5/ch5.html" >
< a href = "../ch5/ch5.html" >
< i class = "fa fa-check" > < / i >
< b > 5.< / b >
函數
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.1" data-path = "ch5/ch5-01.html" >
< a href = "../ch5/ch5-01.html" >
< i class = "fa fa-check" > < / i >
< b > 5.1.< / b >
函數聲明
< / a >
< / li >
< li class = "chapter " data-level = "5.2" data-path = "ch5/ch5-02.html" >
< a href = "../ch5/ch5-02.html" >
< i class = "fa fa-check" > < / i >
< b > 5.2.< / b >
遞歸
< / a >
< / li >
< li class = "chapter " data-level = "5.3" data-path = "ch5/ch5-03.html" >
< a href = "../ch5/ch5-03.html" >
< i class = "fa fa-check" > < / i >
< b > 5.3.< / b >
多返迴值
< / a >
< / li >
< li class = "chapter " data-level = "5.4" data-path = "ch5/ch5-04.html" >
< a href = "../ch5/ch5-04.html" >
< i class = "fa fa-check" > < / i >
< b > 5.4.< / b >
錯誤
< / a >
< / li >
< li class = "chapter " data-level = "5.5" data-path = "ch5/ch5-05.html" >
< a href = "../ch5/ch5-05.html" >
< i class = "fa fa-check" > < / i >
< b > 5.5.< / b >
函數值
< / a >
< / li >
< li class = "chapter " data-level = "5.6" data-path = "ch5/ch5-06.html" >
< a href = "../ch5/ch5-06.html" >
< i class = "fa fa-check" > < / i >
< b > 5.6.< / b >
匿名函數
< / a >
< / li >
< li class = "chapter " data-level = "5.7" data-path = "ch5/ch5-07.html" >
< a href = "../ch5/ch5-07.html" >
< i class = "fa fa-check" > < / i >
< b > 5.7.< / b >
可變參數
< / a >
< / li >
< li class = "chapter " data-level = "5.8" data-path = "ch5/ch5-08.html" >
< a href = "../ch5/ch5-08.html" >
< i class = "fa fa-check" > < / i >
< b > 5.8.< / b >
Deferred函數
< / a >
< / li >
< li class = "chapter " data-level = "5.9" data-path = "ch5/ch5-09.html" >
< a href = "../ch5/ch5-09.html" >
< i class = "fa fa-check" > < / i >
< b > 5.9.< / b >
Panic異常
< / a >
< / li >
< li class = "chapter " data-level = "5.10" data-path = "ch5/ch5-10.html" >
< a href = "../ch5/ch5-10.html" >
< i class = "fa fa-check" > < / i >
< b > 5.10.< / b >
2015-12-28 08:08:26 +00:00
Recover捕獲異常
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "6" data-path = "ch6/ch6.html" >
< a href = "../ch6/ch6.html" >
< i class = "fa fa-check" > < / i >
< b > 6.< / b >
方法
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "6.1" data-path = "ch6/ch6-01.html" >
< a href = "../ch6/ch6-01.html" >
< i class = "fa fa-check" > < / i >
< b > 6.1.< / b >
方法聲明
< / a >
< / li >
< li class = "chapter " data-level = "6.2" data-path = "ch6/ch6-02.html" >
< a href = "../ch6/ch6-02.html" >
< i class = "fa fa-check" > < / i >
< b > 6.2.< / b >
2015-12-21 04:55:18 +00:00
基於指針對象的方法
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "6.3" data-path = "ch6/ch6-03.html" >
< a href = "../ch6/ch6-03.html" >
< i class = "fa fa-check" > < / i >
< b > 6.3.< / b >
通過嵌入結構體來擴展類型
< / a >
< / li >
< li class = "chapter " data-level = "6.4" data-path = "ch6/ch6-04.html" >
< a href = "../ch6/ch6-04.html" >
< i class = "fa fa-check" > < / i >
< b > 6.4.< / b >
2015-12-21 04:55:18 +00:00
方法值和方法表達式
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "6.5" data-path = "ch6/ch6-05.html" >
< a href = "../ch6/ch6-05.html" >
< i class = "fa fa-check" > < / i >
< b > 6.5.< / b >
示例: Bit數組
< / a >
< / li >
< li class = "chapter " data-level = "6.6" data-path = "ch6/ch6-06.html" >
< a href = "../ch6/ch6-06.html" >
< i class = "fa fa-check" > < / i >
< b > 6.6.< / b >
封裝
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "7" data-path = "ch7/ch7.html" >
< a href = "../ch7/ch7.html" >
< i class = "fa fa-check" > < / i >
< b > 7.< / b >
接口
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "7.1" data-path = "ch7/ch7-01.html" >
< a href = "../ch7/ch7-01.html" >
< i class = "fa fa-check" > < / i >
< b > 7.1.< / b >
2015-12-21 04:55:18 +00:00
接口是合約
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "7.2" data-path = "ch7/ch7-02.html" >
< a href = "../ch7/ch7-02.html" >
< i class = "fa fa-check" > < / i >
< b > 7.2.< / b >
接口類型
< / a >
< / li >
< li class = "chapter " data-level = "7.3" data-path = "ch7/ch7-03.html" >
< a href = "../ch7/ch7-03.html" >
< i class = "fa fa-check" > < / i >
< b > 7.3.< / b >
實現接口的條件
< / a >
< / li >
< li class = "chapter " data-level = "7.4" data-path = "ch7/ch7-04.html" >
< a href = "../ch7/ch7-04.html" >
< i class = "fa fa-check" > < / i >
< b > 7.4.< / b >
flag.Value接口
< / a >
< / li >
< li class = "chapter " data-level = "7.5" data-path = "ch7/ch7-05.html" >
< a href = "../ch7/ch7-05.html" >
< i class = "fa fa-check" > < / i >
< b > 7.5.< / b >
接口值
< / a >
< / li >
< li class = "chapter " data-level = "7.6" data-path = "ch7/ch7-06.html" >
< a href = "../ch7/ch7-06.html" >
< i class = "fa fa-check" > < / i >
< b > 7.6.< / b >
sort.Interface接口
< / a >
< / li >
< li class = "chapter " data-level = "7.7" data-path = "ch7/ch7-07.html" >
< a href = "../ch7/ch7-07.html" >
< i class = "fa fa-check" > < / i >
< b > 7.7.< / b >
http.Handler接口
< / a >
< / li >
< li class = "chapter " data-level = "7.8" data-path = "ch7/ch7-08.html" >
< a href = "../ch7/ch7-08.html" >
< i class = "fa fa-check" > < / i >
< b > 7.8.< / b >
error接口
< / a >
< / li >
< li class = "chapter " data-level = "7.9" data-path = "ch7/ch7-09.html" >
< a href = "../ch7/ch7-09.html" >
< i class = "fa fa-check" > < / i >
< b > 7.9.< / b >
2015-12-21 04:55:18 +00:00
示例: 表達式求值
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "7.10" data-path = "ch7/ch7-10.html" >
< a href = "../ch7/ch7-10.html" >
< i class = "fa fa-check" > < / i >
< b > 7.10.< / b >
類型斷言
< / a >
< / li >
< li class = "chapter " data-level = "7.11" data-path = "ch7/ch7-11.html" >
< a href = "../ch7/ch7-11.html" >
< i class = "fa fa-check" > < / i >
< b > 7.11.< / b >
2015-12-21 04:55:18 +00:00
基於類型斷言識别錯誤類型
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "7.12" data-path = "ch7/ch7-12.html" >
< a href = "../ch7/ch7-12.html" >
< i class = "fa fa-check" > < / i >
< b > 7.12.< / b >
通過類型斷言査詢接口
< / a >
< / li >
< li class = "chapter " data-level = "7.13" data-path = "ch7/ch7-13.html" >
< a href = "../ch7/ch7-13.html" >
< i class = "fa fa-check" > < / i >
< b > 7.13.< / b >
類型分支
< / a >
< / li >
< li class = "chapter " data-level = "7.14" data-path = "ch7/ch7-14.html" >
< a href = "../ch7/ch7-14.html" >
< i class = "fa fa-check" > < / i >
< b > 7.14.< / b >
示例: 基於標記的XML解碼
< / a >
< / li >
< li class = "chapter " data-level = "7.15" data-path = "ch7/ch7-15.html" >
< a href = "../ch7/ch7-15.html" >
< i class = "fa fa-check" > < / i >
< b > 7.15.< / b >
補充幾點
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "8" data-path = "ch8/ch8.html" >
< a href = "../ch8/ch8.html" >
< i class = "fa fa-check" > < / i >
< b > 8.< / b >
Goroutines和Channels
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "8.1" data-path = "ch8/ch8-01.html" >
< a href = "../ch8/ch8-01.html" >
< i class = "fa fa-check" > < / i >
< b > 8.1.< / b >
Goroutines
< / a >
< / li >
< li class = "chapter " data-level = "8.2" data-path = "ch8/ch8-02.html" >
< a href = "../ch8/ch8-02.html" >
< i class = "fa fa-check" > < / i >
< b > 8.2.< / b >
2015-12-21 04:55:18 +00:00
示例: 併發的Clock服務
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "8.3" data-path = "ch8/ch8-03.html" >
< a href = "../ch8/ch8-03.html" >
< i class = "fa fa-check" > < / i >
< b > 8.3.< / b >
2015-12-21 04:55:18 +00:00
示例: 併發的Echo服務
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "8.4" data-path = "ch8/ch8-04.html" >
< a href = "../ch8/ch8-04.html" >
< i class = "fa fa-check" > < / i >
< b > 8.4.< / b >
Channels
< / a >
< / li >
< li class = "chapter " data-level = "8.5" data-path = "ch8/ch8-05.html" >
< a href = "../ch8/ch8-05.html" >
< i class = "fa fa-check" > < / i >
< b > 8.5.< / b >
併行的循環
< / a >
< / li >
< li class = "chapter " data-level = "8.6" data-path = "ch8/ch8-06.html" >
< a href = "../ch8/ch8-06.html" >
< i class = "fa fa-check" > < / i >
< b > 8.6.< / b >
2015-12-21 04:55:18 +00:00
示例: 併發的Web爬蟲
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "8.7" data-path = "ch8/ch8-07.html" >
< a href = "../ch8/ch8-07.html" >
< i class = "fa fa-check" > < / i >
< b > 8.7.< / b >
2015-12-21 04:55:18 +00:00
基於select的多路複用
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "8.8" data-path = "ch8/ch8-08.html" >
< a href = "../ch8/ch8-08.html" >
< i class = "fa fa-check" > < / i >
< b > 8.8.< / b >
2015-12-21 04:55:18 +00:00
示例: 併發的字典遍歷
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "8.9" data-path = "ch8/ch8-09.html" >
< a href = "../ch8/ch8-09.html" >
< i class = "fa fa-check" > < / i >
< b > 8.9.< / b >
2015-12-28 08:08:26 +00:00
併發的退出
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "8.10" data-path = "ch8/ch8-10.html" >
< a href = "../ch8/ch8-10.html" >
< i class = "fa fa-check" > < / i >
< b > 8.10.< / b >
示例: 聊天服務
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "9" data-path = "ch9/ch9.html" >
< a href = "../ch9/ch9.html" >
< i class = "fa fa-check" > < / i >
< b > 9.< / b >
2015-12-21 04:55:18 +00:00
基於共享變量的併發
2015-12-09 07:57:17 +00:00
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "9.1" data-path = "ch9/ch9-01.html" >
< a href = "../ch9/ch9-01.html" >
< i class = "fa fa-check" > < / i >
< b > 9.1.< / b >
競爭條件
< / a >
< / li >
< li class = "chapter " data-level = "9.2" data-path = "ch9/ch9-02.html" >
< a href = "../ch9/ch9-02.html" >
< i class = "fa fa-check" > < / i >
< b > 9.2.< / b >
sync.Mutex互斥鎖
< / a >
< / li >
< li class = "chapter " data-level = "9.3" data-path = "ch9/ch9-03.html" >
< a href = "../ch9/ch9-03.html" >
< i class = "fa fa-check" > < / i >
< b > 9.3.< / b >
sync.RWMutex讀寫鎖
< / a >
< / li >
< li class = "chapter " data-level = "9.4" data-path = "ch9/ch9-04.html" >
< a href = "../ch9/ch9-04.html" >
< i class = "fa fa-check" > < / i >
< b > 9.4.< / b >
2015-12-21 04:55:18 +00:00
內存同步
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "9.5" data-path = "ch9/ch9-05.html" >
< a href = "../ch9/ch9-05.html" >
< i class = "fa fa-check" > < / i >
< b > 9.5.< / b >
sync.Once初始化
< / a >
< / li >
< li class = "chapter " data-level = "9.6" data-path = "ch9/ch9-06.html" >
< a href = "../ch9/ch9-06.html" >
< i class = "fa fa-check" > < / i >
< b > 9.6.< / b >
競爭條件檢測
< / a >
< / li >
< li class = "chapter " data-level = "9.7" data-path = "ch9/ch9-07.html" >
< a href = "../ch9/ch9-07.html" >
< i class = "fa fa-check" > < / i >
< b > 9.7.< / b >
2015-12-21 04:55:18 +00:00
示例: 併發的非阻塞緩存
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "9.8" data-path = "ch9/ch9-08.html" >
< a href = "../ch9/ch9-08.html" >
< i class = "fa fa-check" > < / i >
< b > 9.8.< / b >
2015-12-21 04:55:18 +00:00
Goroutines和線程
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "10" data-path = "ch10/ch10.html" >
< a href = "../ch10/ch10.html" >
< i class = "fa fa-check" > < / i >
< b > 10.< / b >
包和工具
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "10.1" data-path = "ch10/ch10-01.html" >
< a href = "../ch10/ch10-01.html" >
< i class = "fa fa-check" > < / i >
< b > 10.1.< / b >
簡介
< / a >
< / li >
< li class = "chapter " data-level = "10.2" data-path = "ch10/ch10-02.html" >
< a href = "../ch10/ch10-02.html" >
< i class = "fa fa-check" > < / i >
< b > 10.2.< / b >
導入路徑
< / a >
< / li >
< li class = "chapter " data-level = "10.3" data-path = "ch10/ch10-03.html" >
< a href = "../ch10/ch10-03.html" >
< i class = "fa fa-check" > < / i >
< b > 10.3.< / b >
包聲明
< / a >
< / li >
< li class = "chapter " data-level = "10.4" data-path = "ch10/ch10-04.html" >
< a href = "../ch10/ch10-04.html" >
< i class = "fa fa-check" > < / i >
< b > 10.4.< / b >
導入聲明
< / a >
< / li >
< li class = "chapter " data-level = "10.5" data-path = "ch10/ch10-05.html" >
< a href = "../ch10/ch10-05.html" >
< i class = "fa fa-check" > < / i >
< b > 10.5.< / b >
匿名導入
< / a >
< / li >
< li class = "chapter " data-level = "10.6" data-path = "ch10/ch10-06.html" >
< a href = "../ch10/ch10-06.html" >
< i class = "fa fa-check" > < / i >
< b > 10.6.< / b >
包和命名
< / a >
< / li >
< li class = "chapter active" data-level = "10.7" data-path = "ch10/ch10-07.html" >
< a href = "../ch10/ch10-07.html" >
< i class = "fa fa-check" > < / i >
< b > 10.7.< / b >
工具
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "11" data-path = "ch11/ch11.html" >
< a href = "../ch11/ch11.html" >
< i class = "fa fa-check" > < / i >
< b > 11.< / b >
測試
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "11.1" data-path = "ch11/ch11-01.html" >
< a href = "../ch11/ch11-01.html" >
< i class = "fa fa-check" > < / i >
< b > 11.1.< / b >
go test
< / a >
< / li >
< li class = "chapter " data-level = "11.2" data-path = "ch11/ch11-02.html" >
< a href = "../ch11/ch11-02.html" >
< i class = "fa fa-check" > < / i >
< b > 11.2.< / b >
測試函數
< / a >
< / li >
< li class = "chapter " data-level = "11.3" data-path = "ch11/ch11-03.html" >
< a href = "../ch11/ch11-03.html" >
< i class = "fa fa-check" > < / i >
< b > 11.3.< / b >
測試覆蓋率
< / a >
< / li >
< li class = "chapter " data-level = "11.4" data-path = "ch11/ch11-04.html" >
< a href = "../ch11/ch11-04.html" >
< i class = "fa fa-check" > < / i >
< b > 11.4.< / b >
基準測試
< / a >
< / li >
< li class = "chapter " data-level = "11.5" data-path = "ch11/ch11-05.html" >
< a href = "../ch11/ch11-05.html" >
< i class = "fa fa-check" > < / i >
< b > 11.5.< / b >
剖析
< / a >
< / li >
< li class = "chapter " data-level = "11.6" data-path = "ch11/ch11-06.html" >
< a href = "../ch11/ch11-06.html" >
< i class = "fa fa-check" > < / i >
< b > 11.6.< / b >
示例函數
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "12" data-path = "ch12/ch12.html" >
< a href = "../ch12/ch12.html" >
< i class = "fa fa-check" > < / i >
< b > 12.< / b >
反射
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "12.1" data-path = "ch12/ch12-01.html" >
< a href = "../ch12/ch12-01.html" >
< i class = "fa fa-check" > < / i >
< b > 12.1.< / b >
2015-12-21 04:55:18 +00:00
爲何需要反射?
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "12.2" data-path = "ch12/ch12-02.html" >
< a href = "../ch12/ch12-02.html" >
< i class = "fa fa-check" > < / i >
< b > 12.2.< / b >
reflect.Type和reflect.Value
< / a >
< / li >
< li class = "chapter " data-level = "12.3" data-path = "ch12/ch12-03.html" >
< a href = "../ch12/ch12-03.html" >
< i class = "fa fa-check" > < / i >
< b > 12.3.< / b >
Display遞歸打印
< / a >
< / li >
< li class = "chapter " data-level = "12.4" data-path = "ch12/ch12-04.html" >
< a href = "../ch12/ch12-04.html" >
< i class = "fa fa-check" > < / i >
< b > 12.4.< / b >
2015-12-21 04:55:18 +00:00
示例: 編碼S表達式
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "12.5" data-path = "ch12/ch12-05.html" >
< a href = "../ch12/ch12-05.html" >
< i class = "fa fa-check" > < / i >
< b > 12.5.< / b >
通過reflect.Value脩改值
< / a >
< / li >
< li class = "chapter " data-level = "12.6" data-path = "ch12/ch12-06.html" >
< a href = "../ch12/ch12-06.html" >
< i class = "fa fa-check" > < / i >
< b > 12.6.< / b >
2015-12-21 04:55:18 +00:00
示例: 解碼S表達式
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "12.7" data-path = "ch12/ch12-07.html" >
< a href = "../ch12/ch12-07.html" >
< i class = "fa fa-check" > < / i >
< b > 12.7.< / b >
2015-12-28 08:08:26 +00:00
獲取結構體字段標識
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "chapter " data-level = "12.8" data-path = "ch12/ch12-08.html" >
< a href = "../ch12/ch12-08.html" >
< i class = "fa fa-check" > < / i >
< b > 12.8.< / b >
顯示一個類型的方法集
< / a >
< / li >
< li class = "chapter " data-level = "12.9" data-path = "ch12/ch12-09.html" >
< a href = "../ch12/ch12-09.html" >
< i class = "fa fa-check" > < / i >
< b > 12.9.< / b >
幾點忠告
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "13" data-path = "ch13/ch13.html" >
< a href = "../ch13/ch13.html" >
< i class = "fa fa-check" > < / i >
< b > 13.< / b >
底層編程
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "13.1" data-path = "ch13/ch13-01.html" >
< a href = "../ch13/ch13-01.html" >
< i class = "fa fa-check" > < / i >
< b > 13.1.< / b >
unsafe.Sizeof, Alignof 和 Offsetof
< / a >
< / li >
< li class = "chapter " data-level = "13.2" data-path = "ch13/ch13-02.html" >
< a href = "../ch13/ch13-02.html" >
< i class = "fa fa-check" > < / i >
< b > 13.2.< / b >
unsafe.Pointer
< / a >
< / li >
< li class = "chapter " data-level = "13.3" data-path = "ch13/ch13-03.html" >
< a href = "../ch13/ch13-03.html" >
< i class = "fa fa-check" > < / i >
< b > 13.3.< / b >
示例: 深度相等判斷
< / a >
< / li >
< li class = "chapter " data-level = "13.4" data-path = "ch13/ch13-04.html" >
< a href = "../ch13/ch13-04.html" >
< i class = "fa fa-check" > < / i >
< b > 13.4.< / b >
通過cgo調用C代碼
< / a >
< / li >
< li class = "chapter " data-level = "13.5" data-path = "ch13/ch13-05.html" >
< a href = "../ch13/ch13-05.html" >
< i class = "fa fa-check" > < / i >
< b > 13.5.< / b >
幾點忠告
< / a >
< / li >
< / ul >
< / li >
2015-12-24 06:47:06 +00:00
< li class = "chapter " data-level = "14" data-path = "CONTRIBUTORS.html" >
2015-12-09 07:57:17 +00:00
2015-12-24 06:47:06 +00:00
< a href = "../CONTRIBUTORS.html" >
2015-12-09 07:57:17 +00:00
< i class = "fa fa-check" > < / i >
2015-12-21 04:55:18 +00:00
< b > 14.< / b >
2015-12-09 07:57:17 +00:00
2015-12-24 06:47:06 +00:00
附録
2015-12-09 07:57:17 +00:00
< / a >
< / li >
< li class = "divider" > < / li >
< li >
< a href = "https://www.gitbook.com" target = "blank" class = "gitbook-link" >
本書使用 GitBook 釋出
< / a >
< / li >
< / ul >
< / nav >
< / div >
< div class = "book-body" >
< div class = "body-inner" >
< div class = "book-header" role = "navigation" >
<!-- Actions Left -->
<!-- Title -->
< h1 >
< i class = "fa fa-circle-o-notch fa-spin" > < / i >
2015-12-31 08:20:27 +00:00
< a href = "../" > Go语言圣经< / a >
2015-12-09 07:57:17 +00:00
< / h1 >
< / div >
< div class = "page-wrapper" tabindex = "-1" role = "main" >
< div class = "page-inner" >
< section class = "normal" id = "section-" >
< h2 id = "107-工具" > 10.7. 工 具 < / h2 >
< p > 本 章 剩 下 的 部 分 將 討 論 Go工 具 箱 的 特 性 , 包 括 如 何 下 載 , 格 式 化 , 構 建 , 測 試 和 安 裝 Go 程 序 .< / p >
2015-12-21 04:55:18 +00:00
< p > Go的 工 具 箱 集 合 了 一 繫 列 的 功 能 到 一 個 命 令 集 . 它 可 以 看 作 是 一 個 包 管 理 器 (類 似 於 Linux中 的 apt和 rpm工 具 ), 用 於 包 的 査 詢 , 計 算 的 包 依 賴 關 繫 , 從 遠 程 版 本 控 製 繫 統 和 下 載 它 們 等 任 務 . 它 也 是 一 個 構 建 繫 統 , 計 算 文 件 的 依 賴 關 繫 , 然 後 調 用 編 譯 器 , 滙 編 器 和 連 接 器 構 建 程 序 , 雖 然 它 故 意 被 設 計 成 沒 有 標 準 的 make命 令 那 麽 複 雜 . 它 也 是 一 個 測 試 驅 動 程 序 , 我 們 在 第 11章 討 論 測 試 話 題 .< / p >
2015-12-28 08:08:26 +00:00
< p > Go工 具 箱 的 命 令 有 着 類 似 " 瑞 士 軍 刀 " 的 風 格 , 帶 着 一 打 子 的 子 命 令 , 有 一 些 我 們 經 常 用 到 , 例 如 get, run, build, 和 fmt 等 . 你 可 以 運 行 < code > go help< / code > 命 令 査 看 內 置 的 溫 度 , 爲 了 査 詢 方 便 , 我 們 列 出 了 最 常 用 的 命 令 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ go
...
build compile packages and dependencies
clean remove object files
doc show documentation for package or symbol
env print Go environment information
fmt run gofmt on package sources
get download and install packages and dependencies
install compile and install packages and dependencies
list list packages
run compile and run Go program
test test packages
version print Go version
vet run go tool vet on packages
Use " go help [command]" for more information about a command.
...
2015-12-21 04:55:18 +00:00
< / code > < / pre > < p > 爲 了 達 到 零 配 置 的 目 標 , Go的 工 具 箱 很 多 地 方 都 依 賴 各 種 約 定 . 例 如 , 給 定 的 源 文 件 的 名 稱 , Go工 具 可 以 找 到 對 應 的 包 , 因 爲 每 個 目 録 隻 包 含 了 單 一 的 包 , 併 且 到 的 導 入 路 徑 和 工 作 區 的 目 録 結 構 是 對 應 的 . 給 定 一 個 包 的 導 入 路 徑 , Go工 具 可 以 找 到 對 應 的 目 録 中 保 存 對 象 的 文 件 . 它 還 可 以 發 現 存 儲 代 碼 倉 庫 的 遠 程 服 務 器 的 URL.< / p >
2015-12-09 07:57:17 +00:00
< h3 id = "1071-工作區結構" > 10.7.1. 工 作 區 結 構 < / h3 >
2015-12-21 04:55:18 +00:00
< p > 對 於 大 多 數 的 Go用 戶 , 隻 需 要 配 置 一 個 名 叫 GOPATH的 環 境 變 量 , 用 來 指 定 根 工 作 目 録 卽 可 . 當 需 要 切 換 到 不 同 工 作 區 的 時 候 , 隻 要 更 新 GOPATH就 可 以 了 . 例 如 , 我 們 在 編 寫 本 書 時 , 將 GOPATH設 置 爲 < code > $HOME/gobook< / code > :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ export GOPATH=$HOME/gobook
$ go get gopl.io/...
2015-12-21 04:55:18 +00:00
< / code > < / pre > < p > 當 你 用 前 面 介 紹 的 命 令 下 載 本 書 全 部 的 程 序 之 後 , 你 的 當 前 工 作 區 的 目 録 結 構 是 這 樣 的 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > GOPATH/
src/
gopl.io/
.git/
ch1/
helloworld/
main.go
dup/
main.go
...
golang.org/x/net/
.git/
html/
parse.go
node.go
...
bin/
helloworld
dup
pkg/
darwin_amd64/
...
2015-12-21 04:55:18 +00:00
< / code > < / pre > < p > GOPATH對 應 的 目 録 有 三 個 子 目 録 . 其 中 src 子 目 録 用 於 存 儲 源 代 碼 . 每 個 包 保 存 在 $GOPATH/src的 相 對 路 徑 爲 包 導 入 路 徑 的 子 目 録 中 , 例 如 gopl.io/ch1/helloworld 相 對 路 徑 . 我 們 看 到 , 一 個 GOPATH工 作 區 的 src目 録 中 可 能 有 多 個 獨 立 的 版 本 控 製 , 例 如 gopl.io 或 golang.org. 其 中 pkg 子 目 録 用 於 保 存 編 譯 後 的 包 的 目 標 文 件 , bin 子 目 録 用 於 保 存 編 譯 後 的 可 執 行 程 序 , 例 如 helloworld 程 序 .< / p >
< p > 第 二 個 環 境 變 量 GOROOT 用 來 指 定 Go的 安 裝 目 録 , 還 有 它 自 帶 的 標 準 庫 包 的 位 置 . GOROOT 的 目 録 結 構 和 GOPATH 類 似 , 因 此 存 放 fmt 包 的 源 代 碼 目 録 爲 $GOROOT/src/fmt. 用 戶 一 般 不 需 要 設 置 GOROOT, 默 認 情 況 下 , Go工 具 會 設 置 爲 安 裝 的 位 置 .< / p >
2015-12-09 07:57:17 +00:00
< p > 其 中 < code > go env< / code > 命 令 用 於 査 看 工 具 涉 及 的 所 有 環 境 變 量 的 值 , 包 括 未 設 置 環 境 變 量 的 默 認 值 . GOOS 用 於 指 定 目 標 操 作 繫 統 (例 如 android, linux, darwin, 或 windows), GOARCH 用 於 指 定 處 理 器 的 類 型 , 例 如 amd64, 386, 或 arm. 雖 然 GOPATH 是 唯 一 必 需 要 設 置 的 , 但 是 其 它 的 也 有 偶 爾 用 到 .< / p >
< pre > < code > $ go env
GOPATH=" /home/gopher/gobook"
GOROOT=" /usr/local/go"
GOARCH=" amd64"
GOOS=" darwin"
...
< / code > < / pre > < h3 id = "1072-下載包" > 10.7.2. 下 載 包 < / h3 >
< p > 使 用 Go工 具 , 不 僅 可 以 根 據 包 導 入 路 徑 找 到 本 地 工 作 區 的 包 , 甚 至 可 以 從 互 聯 網 上 找 到 和 更 新 包 .< / p >
2015-12-28 08:08:26 +00:00
< p > 使 用 命 令 < code > go get< / code > 可 以 下 載 一 個 單 一 的 包 或 者 用 < code > ...< / code > 下 載 整 個 子 目 録 里 面 的 每 個 包 . Go工 具 同 時 計 算 併 下 載 所 依 賴 的 每 個 包 , 這 也 是 前 一 個 例 子 中 golang.org/x/net/html 自 動 出 現 在 本 地 工 作 區 目 録 的 原 因 .< / p >
< p > 一 旦 < code > go get< / code > 命 令 下 載 了 包 , 然 後 就 是 安 裝 包 或 包 對 應 的 命 令 . 我 們 將 在 下 一 節 再 關 註 它 的 細 節 , 現 在 隻 是 展 示 下 整 個 過 程 是 如 何 的 簡 單 . 第 一 個 命 令 是 獲 取 golint 工 具 , 用 於 檢 測 Go源 代 碼 的 編 程 風 格 是 否 有 問 題 . 第 二 個 命 令 是 用 golint 對 2.6.2節 的 gopl.io/ch2/popcount 包 代 碼 進 行 編 碼 風 格 檢 査 . 它 友 好 地 報 告 了 忘 記 了 包 的 文 檔 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ go get github.com/golang/lint/golint
$ $GOPATH/bin/golint gopl.io/ch2/popcount
src/gopl.io/ch2/popcount/main.go:1:1:
package comment should be of the form " Package popcount ..."
2015-12-28 08:08:26 +00:00
< / code > < / pre > < p > < code > go get< / code > 命 令 支 持 當 前 流 行 的 託 管 網 站 GitHub, Bitbucket, 和 Launchpad, 可 以 直 接 從 它 們 的 版 本 控 製 繫 統 請 求 代 碼 . 對 於 其 他 的 網 站 , 你 可 能 需 要 指 定 版 本 控 製 繫 統 的 具 體 路 徑 和 協 議 , 例 如 Git 或 Mercurial. 運 行 < code > go help importpath< / code > 獲 取 更 新 的 信 息 .< / p >
< p > < code > go get< / code > 獲 取 的 代 碼 是 眞 實 的 本 地 存 儲 倉 庫 , 不 僅 僅 隻 是 複 製 文 件 , 因 此 你 依 然 可 以 使 用 版 本 管 理 工 具 比 較 本 地 代 碼 的 變 更 , 或 者 切 換 到 其 他 的 版 本 . 例 如 golang.org/x/net 目 録 對 應 一 個 Git 倉 庫 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ cd $GOPATH/src/golang.org/x/net
$ git remote -v
origin https://go.googlesource.com/net (fetch)
origin https://go.googlesource.com/net (push)
2015-12-21 04:55:18 +00:00
< / code > < / pre > < p > 需 要 註 意 的 是 導 入 路 徑 含 有 的 網 站 域 名 和 本 地 Git倉 庫 遠 程 的 Git服 務 地 址 併 不 相 同 , 眞 實 的 Git地 址 是 go.googlesource.com. 這 其 實 是 Go工 具 箱 的 一 個 特 性 , 可 以 讓 包 用 一 個 自 定 義 的 導 入 路 徑 , 但 是 眞 實 的 代 碼 卻 是 由 更 通 用 的 服 務 提 供 , 例 如 googlesource.com 或 github.com. 頁 面 < a href = "https://golang.org/x/net/html" target = "_blank" > https://golang.org/x/net/html< / a > 包 含 了 如 下 的 元 數 據 , 告 訴 Go 工 具 Git倉 庫 的 眞 實 託 管 地 址 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ go build gopl.io/ch1/fetch
$ ./fetch https://golang.org/x/net/html | grep go-import
< meta name=" go-import"
content=" golang.org/x/net git https://go.googlesource.com/net" >
2015-12-21 04:55:18 +00:00
< / code > < / pre > < p > 如 果 指 定 < code > -u< / code > 命 令 行 標 誌 參 數 , < code > go get< / code > 將 確 保 所 有 的 包 和 依 賴 的 包 的 版 本 都 是 最 新 的 , 然 後 編 譯 和 安 裝 它 們 . 如 果 不 包 含 該 標 誌 參 數 , 如 果 包 已 經 在 本 地 存 在 , 那 麽 將 不 會 被 更 新 .< / p >
< p > < code > go get -u< / code > 命 令 隻 是 簡 單 地 保 證 每 個 包 是 最 新 版 本 , 如 果 你 是 第 一 次 下 載 則 比 較 很 方 便 的 ; 但 是 如 果 是 發 布 程 序 則 可 能 是 不 合 適 的 , 因 爲 本 地 程 序 可 能 需 要 對 依 賴 的 包 做 精 確 的 版 本 依 賴 管 理 . 通 常 的 解 決 方 案 是 使 用 vendor 目 録 存 儲 固 定 版 本 的 代 碼 , 對 本 地 依 賴 的 包 的 版 本 更 新 也 是 謹 慎 和 持 續 可 控 的 . 在 Go 1.5 之 前 , 一 般 需 要 脩 改 包 的 導 入 路 徑 , 所 以 複 製 後 golang.org/x/net/html 導 入 路 徑 可 能 會 變 爲 gopl.io/vendor/golang.org/x/net/html. 最 新 的 Go工 具 已 經 支 持 vendor 特 性 , 但 限 於 篇 幅 這 里 併 不 討 論 細 節 . 不 過 可 以 通 過 < code > go help gopath< / code > 目 録 査 看 Vendor 目 録 的 幫 助 .< / p >
2015-12-28 08:08:26 +00:00
< p > < strong > 練 習 10.3:< / strong > 從 < a href = "http://gopl.io/ch1/helloworld?go-get=1" target = "_blank" > http://gopl.io/ch1/helloworld?go-get=1< / a > 獲 取 內 容 , 査 看 本 書 的 代 碼 的 眞 實 託 管 的 網 址 (< code > go get< / code > 請 求 HTML頁 面 時 包 含 了 < code > go-get< / code > 參 數 , 以 區 别 普 通 的 瀏 覽 器 請 求 .)< / p >
2015-12-09 07:57:17 +00:00
< h3 id = "1073-構建包" > 10.7.3. 構 建 包 < / h3 >
2015-12-28 08:08:26 +00:00
< p > < code > go build< / code > 命 令 編 譯 參 數 指 定 的 每 個 包 . 如 果 包 是 一 個 庫 , 則 忽 略 輸 出 結 果 ; 這 可 以 用 於 檢 測 包 的 可 以 正 確 編 譯 的 .
2015-12-21 04:55:18 +00:00
如 果 包 的 名 字 是 main, < code > go build< / code > 將 調 用 連 接 器 在 當 前 目 録 創 建 一 個 可 執 行 程 序 ; 導 入 路 徑 的 最 後 一 段 作 爲 可 執 行 程 序 的 名 字 .< / p >
< p > 因 爲 每 個 目 録 隻 包 含 一 個 包 , 因 此 每 個 可 執 行 程 序 後 者 叫 Unix術 語 中 的 命 令 , 會 要 求 放 到 一 個 獨 立 的 目 録 . 這 些 目 録 有 時 候 會 放 在 名 叫 cmd 目 録 的 子 目 録 下 面 , 例 如 用 於 提 供 Go文 檔 服 務 的 golang.org/x/tools/cmd/godoc 命 令 (§ 10.7.4).< / p >
< p > 每 個 包 可 以 由 它 們 的 導 入 路 徑 指 定 , 就 像 前 面 看 到 的 那 樣 , 或 者 有 一 個 相 對 目 録 的 路 徑 知 道 , 必 鬚 以 < code > .< / code > 或 < code > ..< / code > 開 頭 . 如 果 沒 有 指 定 參 數 , 那 麽 默 認 指 定 爲 當 前 的 目 録 . 下 面 的 命 令 用 於 構 建 同 一 個 包 , 雖 然 它 們 的 寫 法 各 不 相 同 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ cd $GOPATH/src/gopl.io/ch1/helloworld
$ go build
< / code > < / pre > < p > 或 者 :< / p >
< pre > < code > $ cd anywhere
$ go build gopl.io/ch1/helloworld
< / code > < / pre > < p > 或 者 :< / p >
< pre > < code > $ cd $GOPATH
$ go build ./src/gopl.io/ch1/helloworld
< / code > < / pre > < p > 但 不 能 這 樣 :< / p >
< pre > < code > $ cd $GOPATH
$ go build src/gopl.io/ch1/helloworld
Error: cannot find package " src/gopl.io/ch1/helloworld" .
2015-12-21 04:55:18 +00:00
< / code > < / pre > < p > 也 可 以 指 定 包 的 源 文 件 列 表 , 一 般 這 隻 用 於 構 建 一 些 小 程 序 或 臨 時 性 的 實 驗 . 如 果 是 main包 , 將 以 第 一 個 Go源 文 件 的 基 礎 文 件 名 作 爲 可 執 行 程 序 的 名 字 .< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ cat quoteargs.go
package main
import (
" fmt"
" os"
)
func main() {
fmt.Printf(" %q\n" , os.Args[1:])
}
$ go build quoteargs.go
$ ./quoteargs one " two three" four\ five
[" one" " two three" " four five" ]
2015-12-21 04:55:18 +00:00
< / code > < / pre > < p > 特 别 是 對 於 這 類 一 次 性 的 程 序 , 我 們 繫 統 盡 快 的 構 建 併 運 行 它 . < code > go run< / code > 命 令 結 合 了 構 建 和 運 行 的 兩 個 步 驟 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ go run quoteargs.go one " two three" four\ five
[" one" " two three" " four five" ]
2015-12-21 04:55:18 +00:00
< / code > < / pre > < p > 第 一 行 的 參 數 列 表 中 第 一 個 不 是 以 .go 結 尾 的 將 作 爲 可 執 行 程 序 的 參 數 運 行 .< / p >
2015-12-09 07:57:17 +00:00
< p > 默 認 情 況 下 , < code > go build< / code > 命 令 構 建 指 定 的 包 和 它 依 賴 的 包 , 然 後 丟 棄 所 有 除 了 最 後 的 可 執 行 文 件 之 外 的 中 間 編 譯 結 果 . 依 賴 分 析 和 編 譯 都 是 很 快 的 , 但 是 隨 着 項 目 增 加 到 幾 十 個 包 和 成 韆 上 萬 行 代 碼 , 依 賴 關 繫 分 析 和 編 譯 時 間 的 消 耗 將 變 的 可 觀 , 可 能 需 要 幾 秒 種 , 卽 使 這 些 依 賴 項 沒 有 改 變 .< / p >
2015-12-21 04:55:18 +00:00
< p > < code > go install< / code > 命 令 和 < code > go build< / code > 命 令 很 相 似 , 但 是 它 保 存 每 個 包 的 編 譯 成 果 , 而 不 是 將 它 們 都 丟 棄 . 被 編 譯 的 包 被 保 存 到 $GOPATH/pkg 目 録 下 和 src 目 録 對 應 , 可 執 行 程 序 被 保 存 到 $GOPATH/bin 目 録 . (很 多 用 戶 將 $GOPATH/bin 添 加 到 可 執 行 程 序 的 蒐 索 列 表 中 .) 還 有 , < code > go install< / code > 命 令 和 < code > go build< / code > 命 令 都 不 會 重 新 編 譯 沒 有 發 生 變 化 的 包 , 這 可 以 使 後 續 構 建 更 快 捷 . 爲 了 方 便 , < code > go build -i< / code > 將 安 裝 每 個 目 標 所 依 賴 的 包 .< / p >
2015-12-28 08:08:26 +00:00
< p > 因 爲 編 譯 對 應 不 同 的 操 作 繫 統 平 台 和 CPU架 構 , < code > go install< / code > 會 將 編 譯 結 果 安 裝 到 GOOS 和 GOARCH 對 應 的 目 録 . 例 如 , 在 Mac 繫 統 golang.org/x/net/html 包 將 被 安 裝 到 $GOPATH/pkg/darwin_amd64 目 録 下 的 golang.org/x/net/html.a 文 件 .< / p >
< p > 針 對 不 同 操 作 繫 統 或 CPU的 交 叉 構 建 也 是 很 簡 單 的 . 隻 需 要 設 置 好 目 標 對 應 的 GOOS 和 GOARCH, 然 後 運 行 構 建 目 録 卽 可 . 下 面 交 叉 編 譯 的 程 序 將 輸 出 它 在 編 譯 時 操 作 繫 統 和 CPU類 型 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code class = "lang-Go" > gopl.io/ch10/cross
< span class = "hljs-keyword" > func< / span > main() {
fmt.Println(runtime.GOOS, runtime.GOARCH)
}
< / code > < / pre >
2015-12-21 04:55:18 +00:00
< p > 下 面 以 64位 和 32位 環 境 分 别 執 行 程 序 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ go build gopl.io/ch10/cross
$ ./cross
darwin amd64
$ GOARCH=386 go build gopl.io/ch10/cross
$ ./cross
darwin 386
2015-12-28 08:08:26 +00:00
< / code > < / pre > < p > 有 些 包 可 能 需 要 針 對 不 同 平 台 和 處 理 器 類 型 輸 出 不 同 版 本 的 代 碼 , 以 便 於 處 理 底 層 的 可 移 植 性 問 題 或 提 供 爲 一 些 特 點 代 碼 提 供 優 化 . 如 果 一 個 文 件 名 包 含 了 一 個 操 作 繫 統 或 處 理 器 類 型 名 字 , 例 如 net_linux.go 或 asm_amd64.s, Go工 具 將 隻 在 對 應 的 平 台 編 譯 這 些 文 件 . 還 有 一 個 特 别 的 構 建 註 釋 註 釋 可 以 提 供 更 多 的 構 建 控 製 . 例 如 , 文 件 中 如 果 包 含 下 面 的 註 釋 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code class = "lang-Go" > < span class = "hljs-comment" > // +build linux darwin< / span >
< / code > < / pre >
2015-12-28 08:08:26 +00:00
< p > 在 包 聲 明 的 前 面 (含 包 的 註 釋 ), 告 訴 < code > go build< / code > 隻 在 針 對 Linux 或 Mac OS X 是 才 編 譯 這 個 文 件 . 下 面 的 構 建 註 釋 表 示 不 編 譯 這 個 文 件 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code class = "lang-Go" > < span class = "hljs-comment" > // +build ignore< / span >
< / code > < / pre >
< p > For more details, see the Build Constraints section of the go/build package’ s documentation:< / p >
< p > 更 多 細 節 , 可 以 參 考 go/build 包 的 構 建 約 束 部 分 的 文 檔 .< / p >
< pre > < code > $ go doc go/build
< / code > < / pre > < h3 id = "1074-包文檔" > 10.7.4. 包 文 檔 < / h3 >
2015-12-28 08:08:26 +00:00
< p > Go的 編 碼 風 格 鼓 勵 爲 每 個 包 提 供 良 好 的 文 檔 . 包 中 每 個 導 出 的 成 員 和 包 聲 明 前 都 應 該 包 含 添 加 目 的 和 用 法 説 明 的 註 釋 .< / p >
2015-12-21 04:55:18 +00:00
< p > Go中 包 文 檔 註 釋 一 般 是 完 整 的 句 子 , 第 一 行 是 包 的 摘 要 説 明 , 註 釋 後 僅 跟 着 包 聲 明 語 句 . 函 數 的 參 數 或 其 他 的 標 識 符 併 不 需 要 額 外 的 引 號 或 其 他 標 記 註 明 . 例 如 , 下 面 是 fmt.Fprintf 的 文 檔 註 釋 .< / p >
2015-12-09 07:57:17 +00:00
< pre > < code class = "lang-Go" > < span class = "hljs-comment" > // Fprintf formats according to a format specifier and writes to w.< / span >
< span class = "hljs-comment" > // It returns the number of bytes written and any write error encountered.< / span >
< span class = "hljs-keyword" > func< / span > Fprintf(w io.Writer, format < span class = "hljs-typename" > string< / span > , a ...< span class = "hljs-keyword" > interface< / span > {}) (< span class = "hljs-typename" > int< / span > , error)
< / code > < / pre >
2015-12-28 08:08:26 +00:00
< p > Fprintf 函 數 格 式 化 的 細 節 在 fmt 包 文 檔 中 描 述 . 如 果 註 釋 後 僅 跟 着 包 聲 明 語 句 , 那 註 釋 對 應 整 個 包 的 文 檔 . 包 文 檔 對 應 的 註 釋 隻 能 有 一 個 (譯 註 : 其 實 可 以 多 個 , 它 們 會 組 合 成 一 個 包 文 檔 註 釋 .), 可 以 出 現 在 任 何 一 個 源 文 件 中 . 如 果 包 的 註 釋 內 容 比 較 長 , 可 以 當 到 一 個 獨 立 的 文 件 中 ; fmt 包 註 釋 就 有 300 行 之 多 . 這 個 專 門 用 於 保 證 包 文 檔 的 文 件 通 常 叫 doc.go.< / p >
2015-12-21 04:55:18 +00:00
< p > 好 的 文 檔 併 不 需 要 面 面 俱 到 , 文 檔 本 身 應 該 是 簡 潔 但 可 不 忽 略 的 . 事 實 上 , Go的 風 格 喜 歡 簡 潔 的 文 檔 , 併 且 文 檔 也 是 需 要 想 代 碼 一 樣 維 護 的 . 對 於 一 組 聲 明 語 句 , 可 以 同 一 個 精 鍊 的 句 子 描 述 , 如 果 是 顯 而 易 見 的 功 能 則 併 不 需 要 註 釋 .< / p >
< p > 在 本 書 中 , 隻 要 空 間 允 許 , 我 們 之 前 很 多 包 聲 明 都 包 含 了 註 釋 文 檔 , 但 你 可 以 從 標 準 庫 中 發 現 很 多 更 好 的 例 子 . 有 兩 個 工 具 可 以 幫 到 你 .< / p >
< p > < code > go doc< / code > 命 令 打 印 包 的 聲 明 和 每 個 成 員 的 文 檔 註 釋 , 下 面 是 整 個 包 的 文 檔 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ go doc time
package time // import " time"
Package time provides functionality for measuring and displaying time.
const Nanosecond Duration = 1 ...
func After(d Duration) < -chan Time
func Sleep(d Duration)
func Since(t Time) Duration
func Now() Time
type Duration int64
type Time struct { ... }
...many more...
< / code > < / pre > < p > 或 者 是 包 的 一 個 成 員 的 註 釋 文 檔 :< / p >
< pre > < code > $ go doc time.Since
func Since(t Time) Duration
Since returns the time elapsed since t.
It is shorthand for time.Now().Sub(t).
< / code > < / pre > < p > 或 者 是 包 的 一 個 方 法 的 註 釋 文 檔 :< / p >
< pre > < code > $ go doc time.Duration.Seconds
func (d Duration) Seconds() float64
Seconds returns the duration as a floating-point number of seconds.
2015-12-21 04:55:18 +00:00
< / code > < / pre > < p > 該 工 具 併 不 需 要 輸 入 完 整 的 包 導 入 路 徑 或 正 確 的 大 小 寫 . 下 面 的 命 令 打 印 encoding/json 包 的 (*json.Decoder).Decode 方 法 的 文 檔 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ go doc json.decode
func (dec *Decoder) Decode(v interface{}) error
Decode reads the next JSON-encoded value from its input and stores
it in the value pointed to by v.
2015-12-21 04:55:18 +00:00
< / code > < / pre > < p > 第 二 個 工 具 , 令 人 睏 惑 的 也 是 名 叫 godoc, 提 供 可 以 相 互 交 叉 引 用 的 HTML 頁 面 , 但 是 包 含 和 < code > go doc< / code > 相 同 以 及 更 多 的 信 息 . 10.1 節 演 示 了 time 包 的 文 檔 , 11.6 節 將 看 到 godoc演 示 可 以 交 互 的 示 例 程 序 . godoc 的 在 線 服 務 < a href = "https://godoc.org" target = "_blank" > https://godoc.org< / a > , 包 含 了 成 韆 上 萬 的 開 源 包 的 檢 索 工 具 .< / p >
2015-12-09 07:57:17 +00:00
< p > You can also run an instance of godoc in your workspace if you want to browse your own packages. Visit < a href = "http://localhost:8000/pkg" target = "_blank" > http://localhost:8000/pkg< / a > in your browser while running this command:< / p >
2015-12-21 04:55:18 +00:00
< p > 你 也 可 以 在 自 己 的 工 作 區 目 録 允 許 godoc 服 務 . 運 行 下 面 的 命 令 , 然 後 在 瀏 覽 器 査 看 < a href = "http://localhost:8000/pkg" target = "_blank" > http://localhost:8000/pkg< / a > 頁 面 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ godoc -http :8000
< / code > < / pre > < p > 其 中 < code > -analysis=type< / code > 和 < code > -analysis=pointer< / code > 命 令 行 標 誌 參 數 用 於 打 開 文 檔 和 代 碼 中 關 於 靜 態 分 析 的 結 果 .< / p >
< h3 id = "1075-內部包" > 10.7.5. 內 部 包 < / h3 >
2015-12-28 08:08:26 +00:00
< p > 在 Go程 序 中 , 包 的 封 裝 機 製 是 一 個 重 要 的 特 性 . 爲 導 出 的 標 識 符 隻 在 同 一 個 包 內 部 可 以 訪 問 , 導 出 的 標 識 符 則 是 面 向 全 世 界 可 見 .< / p >
< p > 有 時 候 , 一 個 中 間 的 狀 態 可 能 也 是 有 用 的 , 對 於 一 小 部 分 信 任 的 包 是 可 見 的 , 但 併 不 是 對 所 有 調 用 者 都 可 見 . 例 如 , 當 我 們 計 劃 將 一 個 大 的 包 拆 分 爲 很 多 小 的 更 容 易 管 理 的 子 包 , 但 是 我 們 併 不 想 將 內 部 的 子 包 結 構 也 完 全 暴 露 出 去 . 同 時 , 我 們 肯 呢 個 還 希 望 在 內 部 子 包 之 間 共 享 一 些 通 用 的 處 理 包 . 或 者 我 們 隻 是 想 實 驗 一 個 新 包 的 還 併 不 穩 定 的 接 口 , 暫 時 隻 暴 露 給 一 些 受 限 製 的 客 戶 端 .< / p >
2015-12-09 07:57:17 +00:00
< p > < img src = "../images/ch10-01.png" alt = "" > < / p >
2015-12-21 04:55:18 +00:00
< p > 爲 了 滿 足 這 些 需 求 , Go構 建 工 具 支 持 包 含 internal 名 字 的 路 徑 段 的 包 導 入 路 徑 . 這 種 包 叫 internal 包 , 一 個 internal 包 隻 能 被 有 和 internal目 録 有 同 一 個 父 目 録 的 包 所 導 入 . 例 如 , net/http/internal/chunked 內 部 包 隻 能 被 net/http/httputil 或 net/http 導 入 , 但 是 不 能 被 net/url 包 導 入 . 但 是 net/url 包 可 以 導 入 net/http/httputil.< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > net/http
net/http/internal/chunked
net/http/httputil
net/url
< / code > < / pre > < h3 id = "1076-査詢包" > 10.7.6. 査 詢 包 < / h3 >
< p > < code > go list< / code > 工 具 可 以 報 告 可 用 包 的 信 息 . 其 最 簡 單 的 形 式 , 可 以 測 試 包 是 否 在 工 作 區 併 打 印 他 的 導 入 路 徑 :< / p >
< pre > < code > $ go list github.com/go-sql-driver/mysql
github.com/go-sql-driver/mysql
2015-12-21 04:55:18 +00:00
< / code > < / pre > < p > < code > go list< / code > 參 數 還 可 以 用 < code > " ..." < / code > 表 示 匹 配 任 意 的 包 的 導 入 路 徑 . 我 們 可 以 用 它 來 列 表 工 作 區 中 的 所 有 包 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ go list ...
archive/tar
archive/zip
bufio
bytes
cmd/addr2line
cmd/api
...many more...
2015-12-21 04:55:18 +00:00
< / code > < / pre > < p > 或 者 是 特 定 子 目 録 下 的 所 有 包 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ go list gopl.io/ch3/...
gopl.io/ch3/basename1
gopl.io/ch3/basename2
gopl.io/ch3/comma
gopl.io/ch3/mandelbrot
gopl.io/ch3/netflag
gopl.io/ch3/printints
gopl.io/ch3/surface
< / code > < / pre > < p > 或 者 是 和 某 個 主 體 相 關 的 :< / p >
< pre > < code > $ go list ...xml...
encoding/xml
gopl.io/ch7/xmlselect
2015-12-28 08:08:26 +00:00
< / code > < / pre > < p > < code > go list< / code > 可 以 獲 取 每 個 包 完 整 的 元 信 息 , 而 不 僅 僅 隻 是 導 入 路 徑 , 這 些 信 息 可 以 以 不 同 格 式 提 供 給 用 戶 . 其 中 < code > -json< / code > 標 誌 參 數 表 示 用 JSON格 式 打 印 每 個 包 的 元 信 息 .< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ go list -json hash
{
" Dir" : " /home/gopher/go/src/hash" ,
" ImportPath" : " hash" ,
" Name" : " hash" ,
" Doc" : " Package hash provides interfaces for hash functions." ,
" Target" : " /home/gopher/go/pkg/darwin_amd64/hash.a" ,
" Goroot" : true,
" Standard" : true,
" Root" : " /home/gopher/go" ,
" GoFiles" : [
" hash.go"
],
" Imports" : [
" io"
],
" Deps" : [
" errors" ,
" io" ,
" runtime" ,
" sync" ,
" sync/atomic" ,
" unsafe"
]
}
2015-12-28 08:08:26 +00:00
< / code > < / pre > < p > 參 數 < code > -f< / code > 允 許 用 戶 使 用 text/template (§ 4.6) 的 模 闆 語 言 定 義 輸 出 文 本 的 格 式 . 下 面 的 命 令 打 印 strconv 包 的 依 賴 的 包 , 然 後 用 join 模 闆 函 數 鏈 接 爲 一 行 , 用 一 個 空 格 分 隔 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ go list -f ' {{join .Deps " " }}' strconv
errors math runtime unicode/utf8 unsafe
2015-12-21 04:55:18 +00:00
< / code > < / pre > < p > 譯 註 : 上 面 的 命 令 在 Windows 的 命 令 行 運 行 會 遇 到 < code > template: main:1: unclosed action< / code > 的 錯 誤 . 産 生 錯 誤 的 原 因 是 因 爲 命 令 行 對 里 面 的 < code > " " < / code > 參 數 進 行 轉 義 了 . 按 照 下 面 的 方 法 解 決 轉 義 字 符 串 的 問 題 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ go list -f " {{join .Deps \" \" }}" strconv
2015-12-21 04:55:18 +00:00
< / code > < / pre > < p > 下 面 的 命 令 打 印 compress 子 目 録 下 所 有 包 的 依 賴 包 列 表 :< / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ go list -f ' {{.ImportPath}} -> {{join .Imports " " }}' compress/...
compress/bzip2 -> bufio io sort
compress/flate -> bufio fmt io math sort strconv
compress/gzip -> bufio compress/flate errors fmt hash hash/crc32 io time
compress/lzw -> bufio errors fmt io
compress/zlib -> bufio compress/flate errors fmt hash hash/adler32 io
2015-12-21 04:55:18 +00:00
< / code > < / pre > < p > 譯 註 : Windows 下 同 樣 有 問 題 , 要 避 免 轉 義 字 符 串 的 問 題 : < / p >
2015-12-09 07:57:17 +00:00
< pre > < code > $ go list -f " {{.ImportPath}} -> {{join .Imports \" \" }}" compress/...
< / code > < / pre > < p > go list 命 令 對 於 一 次 性 的 交 互 式 査 詢 或 自 動 化 構 建 和 測 試 腳 本 都 很 有 幫 助 . 我 們 將 在 11.2.4節 中 再 次 使 用 它 . 更 多 的 信 息 , 包 括 可 設 置 的 字 段 和 意 義 , 可 以 用 < code > go help list< / code > 命 令 査 看 .< / p >
< p > 在 本 章 , 我 們 解 釋 了 Go工 具 箱 除 了 測 試 命 令 之 外 的 所 有 重 要 的 命 令 . 在 下 一 章 , 我 們 將 看 到 如 何 用 < code > go test< / code > 命 令 去 測 試 Go程 序 .< / p >
2015-12-28 08:08:26 +00:00
< p > < strong > 練 習 10.4:< / strong > 創 建 一 個 工 具 , 根 據 命 令 行 指 定 的 參 數 , 報 告 工 作 區 所 有 依 賴 指 定 包 的 其 他 包 集 合 . 提 示 : 你 需 要 運 行 < code > go list< / code > 命 令 兩 次 , 一 次 用 於 初 始 化 包 , 一 次 用 於 所 有 包 . 你 可 能 需 要 用 encoding/json (§ 4.5) 包 來 分 析 輸 出 的 JSON 格 式 的 信 息 .< / p >
2015-12-09 07:57:17 +00:00
< / section >
< / div >
< / div >
< / div >
< a href = "../ch10/ch10-06.html" class = "navigation navigation-prev " aria-label = "Previous page: 包和命名" > < i class = "fa fa-angle-left" > < / i > < / a >
< a href = "../ch11/ch11.html" class = "navigation navigation-next " aria-label = "Next page: 測試" > < i class = "fa fa-angle-right" > < / i > < / a >
< / div >
< / div >
< script src = "../gitbook/app.js" > < / script >
< script src = "../gitbook/plugins/gitbook-plugin-sharing/buttons.js" > < / script >
< script src = "../gitbook/plugins/gitbook-plugin-fontsettings/buttons.js" > < / script >
< script >
require(["gitbook"], function(gitbook) {
2015-12-28 08:08:26 +00:00
var config = {"katex":{},"highlight":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2}};
2015-12-09 07:57:17 +00:00
gitbook.start(config);
});
< / script >
< / body >
< / html >