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 = "" >
< meta name = "generator" content = "GitBook 2.5.2" >
< 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 = "../ch3/ch3.html" / >
< link rel = "prev" href = "../ch2/ch2-06.html" / >
< / head >
< body >
2015-12-31 08:20:27 +00:00
< div class = "book" data-level = "2.7" data-chapter-title = "作用域" data-filepath = "ch2/ch2-07.md" data-basepath = ".." data-revision = "Thu Dec 31 2015 16:18:40 GMT+0800 (中国标准时间)" >
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 active" 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 " 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 = "27-作用域" > 2.7. 作 用 域 < / h2 >
2015-12-28 08:08:26 +00:00
< p > 一 個 聲 明 語 句 將 程 序 中 的 實 體 和 一 個 名 字 關 聯 , 比 如 一 個 函 數 或 一 個 變 量 。 聲 明 語 句 的 作 用 域 是 指 源 代 碼 中 可 以 有 效 使 用 這 個 名 字 的 范 圍 。 < / p >
< p > 不 要 將 作 用 域 和 生 命 週 期 混 爲 一 談 。 聲 明 語 句 的 作 用 域 對 應 的 是 一 個 源 代 碼 的 文 本 區 域 ; 它 是 一 個 編 譯 時 的 屬 性 。 一 個 變 量 的 生 命 週 期 是 指 程 序 運 行 時 變 量 存 在 的 有 效 時 間 段 , 在 此 時 間 區 域 內 它 可 以 被 程 序 的 其 他 部 分 引 用 ; 是 一 個 運 行 時 的 概 念 。 < / p >
< p > 語 法 塊 是 由 花 括 弧 所 包 含 的 一 繫 列 語 句 , 就 像 函 數 體 或 循 環 體 花 括 弧 對 應 的 語 法 塊 那 樣 。 語 法 塊 內 部 聲 明 的 名 字 是 無 法 被 外 部 語 法 塊 訪 問 的 。 語 法 決 定 了 內 部 聲 明 的 名 字 的 作 用 域 范 圍 。 我 們 可 以 這 樣 理 解 , 語 法 塊 可 以 包 含 其 他 類 似 組 批 量 聲 明 等 沒 有 用 花 括 弧 包 含 的 代 碼 , 我 們 稱 之 爲 語 法 塊 。 有 一 個 語 法 塊 爲 整 個 源 代 碼 , 稱 爲 全 局 語 法 塊 ; 然 後 是 每 個 包 的 包 語 法 決 ; 每 個 for、 if和 switch語 句 的 語 法 決 ; 每 個 switch或 select的 分 支 也 有 獨 立 的 語 法 決 ; 當 然 也 包 括 顯 式 書 寫 的 語 法 塊 ( 花 括 弧 包 含 的 語 句 ) 。 < / p >
< p > 聲 明 語 句 對 應 的 詞 法 域 決 定 了 作 用 域 范 圍 的 大 小 。 對 於 內 置 的 類 型 、 函 數 和 常 量 , 比 如 int、 len和 true等 是 在 全 局 作 用 域 的 , 因 此 可 以 在 整 個 程 序 中 直 接 使 用 。 任 何 在 在 函 數 外 部 ( 也 就 是 包 級 語 法 域 ) 聲 明 的 名 字 可 以 在 同 一 個 包 的 任 何 源 文 件 中 訪 問 的 。 對 於 導 入 的 包 , 例 如 tempconv導 入 的 fmt包 , 則 是 對 應 源 文 件 級 的 作 用 域 , 因 此 隻 能 在 當 前 的 文 件 中 訪 問 導 入 的 fmt包 , 當 前 包 的 其 它 源 文 件 無 法 訪 問 在 當 前 源 文 件 導 入 的 包 。 還 有 許 多 聲 明 語 句 , 比 如 tempconv.CToF函 數 中 的 變 量 c, 則 是 局 部 作 用 域 的 , 它 隻 能 在 函 數 內 部 ( 甚 至 隻 能 是 局 部 的 某 些 部 分 ) 訪 問 。 < / p >
< p > 控 製 流 標 號 , 就 是 break、 continue或 goto語 句 後 面 跟 着 的 那 種 標 號 , 則 是 函 數 級 的 作 用 域 。 < / p >
< p > 一 個 程 序 可 能 包 含 多 個 同 名 的 聲 明 , 隻 要 它 們 在 不 同 的 詞 法 域 就 沒 有 關 繫 。 例 如 , 你 可 以 聲 明 一 個 局 部 變 量 , 和 包 級 的 變 量 同 名 。 或 者 是 像 2.3.3節 的 例 子 那 樣 , 你 可 以 將 一 個 函 數 參 數 的 名 字 聲 明 爲 new, 雖 然 內 置 的 new是 全 局 作 用 域 的 。 但 是 物 極 必 反 , 如 果 濫 用 不 同 詞 法 域 可 重 名 的 特 性 的 話 , 可 能 導 致 程 序 很 難 閲 讀 。 < / p >
< p > 當 編 譯 器 遇 到 一 個 名 字 引 用 時 , 如 果 它 看 起 來 像 一 個 聲 明 , 它 首 先 從 最 內 層 的 詞 法 域 向 全 局 的 作 用 域 査 找 。 如 果 査 找 失 敗 , 則 報 告 “ 未 聲 明 的 名 字 ” 這 樣 的 錯 誤 。 如 果 該 名 字 在 內 部 和 外 部 的 塊 分 别 聲 明 過 , 則 內 部 塊 的 聲 明 首 先 被 找 到 。 在 這 種 情 況 下 , 內 部 聲 明 屏 蔽 了 外 部 同 名 的 聲 明 , 讓 外 部 的 聲 明 的 名 字 無 法 被 訪 問 : < / p >
2015-12-09 07:57:17 +00:00
< pre > < code class = "lang-Go" > < span class = "hljs-keyword" > func< / span > f() {}
< span class = "hljs-keyword" > var< / span > g = < span class = "hljs-string" > " g" < / span >
< span class = "hljs-keyword" > func< / span > main() {
f := < span class = "hljs-string" > " f" < / span >
fmt.Println(f) < span class = "hljs-comment" > // " f" ; local var f shadows package-level func f< / span >
fmt.Println(g) < span class = "hljs-comment" > // " g" ; package-level var< / span >
fmt.Println(h) < span class = "hljs-comment" > // compile error: undefined: h< / span >
}
< / code > < / pre >
2015-12-28 08:08:26 +00:00
< p > 在 函 數 中 詞 法 域 可 以 深 度 嵌 套 , 因 此 內 部 的 一 個 聲 明 可 能 屏 蔽 外 部 的 聲 明 。 還 有 許 多 語 法 塊 是 if或 for等 控 製 流 語 句 構 造 的 。 下 面 的 代 碼 有 三 個 不 同 的 變 量 x, 因 爲 它 們 是 定 義 在 不 同 的 詞 法 域 ( 這 個 例 子 隻 是 爲 了 演 示 作 用 域 規 則 , 但 不 是 好 的 編 程 風 格 ) 。 < / p >
2015-12-09 07:57:17 +00:00
< pre > < code class = "lang-Go" > < span class = "hljs-keyword" > func< / span > main() {
x := < span class = "hljs-string" > " hello!" < / span >
< span class = "hljs-keyword" > for< / span > i := < span class = "hljs-number" > 0< / span > ; i < < span class = "hljs-built_in" > len< / span > (x); i++ {
x := x[i]
< span class = "hljs-keyword" > if< / span > x != < span class = "hljs-string" > ' !' < / span > {
x := x + < span class = "hljs-string" > ' A' < / span > - < span class = "hljs-string" > ' a' < / span >
fmt.Printf(< span class = "hljs-string" > " %c" < / span > , x) < span class = "hljs-comment" > // " HELLO" (one letter per iteration)< / span >
}
}
}
< / code > < / pre >
2015-12-28 08:08:26 +00:00
< p > 在 < code > x[i]< / code > 和 < code > x + ' A' - ' a' < / code > 聲 明 語 句 的 初 始 化 的 表 達 式 中 都 引 用 了 外 部 作 用 域 聲 明 的 x變 量 , 稍 後 我 們 會 解 釋 這 個 。 ( 註 意 , 後 面 的 表 達 式 與 unicode.ToUpper併 不 等 價 。 ) < / p >
< p > 正 如 上 面 例 子 所 示 , 併 不 是 所 有 的 詞 法 域 都 顯 式 地 對 應 到 由 花 括 弧 包 含 的 語 句 ; 還 有 一 些 隱 含 的 規 則 。 上 面 的 for語 句 創 建 了 兩 個 詞 法 域 : 花 括 弧 包 含 的 是 顯 式 的 部 分 是 for的 循 環 體 部 分 詞 法 域 , 另 外 一 個 隱 式 的 部 分 則 是 循 環 的 初 始 化 部 分 , 比 如 用 於 迭 代 變 量 i的 初 始 化 。 隱 式 的 詞 法 域 部 分 的 作 用 域 還 包 含 條 件 測 試 部 分 和 循 環 後 的 迭 代 部 分 ( < code > i++< / code > ) , 當 然 也 包 含 循 環 體 詞 法 域 。 < / p >
< p > 下 面 的 例 子 同 樣 有 三 個 不 同 的 x變 量 , 每 個 聲 明 在 不 同 的 詞 法 域 , 一 個 在 函 數 體 詞 法 域 , 一 個 在 for隱 式 的 初 始 化 詞 法 域 , 一 個 在 for循 環 體 詞 法 域 ; 隻 有 兩 個 塊 是 顯 式 創 建 的 : < / p >
2015-12-09 07:57:17 +00:00
< pre > < code class = "lang-Go" > < span class = "hljs-keyword" > func< / span > main() {
x := < span class = "hljs-string" > " hello" < / span >
< span class = "hljs-keyword" > for< / span > _, x := < span class = "hljs-keyword" > range< / span > x {
x := x + < span class = "hljs-string" > ' A' < / span > - < span class = "hljs-string" > ' a' < / span >
fmt.Printf(< span class = "hljs-string" > " %c" < / span > , x) < span class = "hljs-comment" > // " HELLO" (one letter per iteration)< / span >
}
}
< / code > < / pre >
2015-12-28 08:08:26 +00:00
< p > 和 for循 環 類 似 , if和 switch語 句 也 會 在 條 件 部 分 創 建 隱 式 詞 法 域 , 還 有 它 們 對 應 的 執 行 體 詞 法 域 。 下 面 的 if-else測 試 鏈 演 示 了 x和 y的 有 效 作 用 域 范 圍 : < / p >
2015-12-09 07:57:17 +00:00
< pre > < code class = "lang-Go" > < span class = "hljs-keyword" > if< / span > x := f(); x == < span class = "hljs-number" > 0< / span > {
fmt.Println(x)
} < span class = "hljs-keyword" > else< / span > < span class = "hljs-keyword" > if< / span > y := g(x); x == y {
fmt.Println(x, y)
} < span class = "hljs-keyword" > else< / span > {
fmt.Println(x, y)
}
fmt.Println(x, y) < span class = "hljs-comment" > // compile error: x and y are not visible here< / span >
< / code > < / pre >
2015-12-28 08:08:26 +00:00
< p > 第 二 個 if語 句 嵌 套 在 第 一 個 內 部 , 因 此 第 一 個 if語 句 條 件 初 始 化 詞 法 域 聲 明 的 變 量 在 第 二 個 if中 也 可 以 訪 問 。 switch語 句 的 每 個 分 支 也 有 類 似 的 詞 法 域 規 則 : 條 件 部 分 爲 一 個 隱 式 詞 法 域 , 然 後 每 個 是 每 個 分 支 的 詞 法 域 。 < / p >
< p > 在 包 級 别 , 聲 明 的 順 序 併 不 會 影 響 作 用 域 范 圍 , 因 此 一 個 先 聲 明 的 可 以 引 用 它 自 身 或 者 是 引 用 後 面 的 一 個 聲 明 , 這 可 以 讓 我 們 定 義 一 些 相 互 嵌 套 或 遞 歸 的 類 型 或 函 數 。 但 是 如 果 一 個 變 量 或 常 量 遞 歸 引 用 了 自 身 , 則 會 産 生 編 譯 錯 誤 。 < / p >
< p > 在 這 個 程 序 中 : < / p >
2015-12-09 07:57:17 +00:00
< pre > < code class = "lang-Go" > < span class = "hljs-keyword" > if< / span > f, err := os.Open(fname); err != < span class = "hljs-constant" > nil< / span > { < span class = "hljs-comment" > // compile error: unused: f< / span >
< span class = "hljs-keyword" > return< / span > err
}
f.ReadByte() < span class = "hljs-comment" > // compile error: undefined f< / span >
f.Close() < span class = "hljs-comment" > // compile error: undefined f< / span >
< / code > < / pre >
2015-12-28 08:08:26 +00:00
< p > 變 量 f的 作 用 域 隻 有 在 if語 句 內 , 因 此 後 面 的 語 句 將 無 法 引 入 它 , 這 將 導 致 編 譯 錯 誤 。 你 可 能 會 收 到 一 個 局 部 變 量 f沒 有 聲 明 的 錯 誤 提 示 , 具 體 錯 誤 信 息 依 賴 編 譯 器 的 實 現 。 < / p >
< p > 通 常 需 要 在 if之 前 聲 明 變 量 , 這 樣 可 以 確 保 後 面 的 語 句 依 然 可 以 訪 問 變 量 : < / p >
2015-12-09 07:57:17 +00:00
< pre > < code class = "lang-Go" > f, err := os.Open(fname)
< span class = "hljs-keyword" > if< / span > err != < span class = "hljs-constant" > nil< / span > {
< span class = "hljs-keyword" > return< / span > err
}
f.ReadByte()
f.Close()
< / code > < / pre >
2015-12-28 08:08:26 +00:00
< p > 你 可 能 會 考 慮 通 過 將 ReadByte和 Close移 動 到 if的 else塊 來 解 決 這 個 問 題 : < / p >
2015-12-09 07:57:17 +00:00
< pre > < code class = "lang-Go" > < span class = "hljs-keyword" > if< / span > f, err := os.Open(fname); err != < span class = "hljs-constant" > nil< / span > {
< span class = "hljs-keyword" > return< / span > err
} < span class = "hljs-keyword" > else< / span > {
< span class = "hljs-comment" > // f and err are visible here too< / span >
f.ReadByte()
f.Close()
}
< / code > < / pre >
2015-12-28 08:08:26 +00:00
< p > 但 這 不 是 Go語 言 推 薦 的 做 法 , Go語 言 的 習 慣 是 在 if中 處 理 錯 誤 然 後 直 接 返 迴 , 這 樣 可 以 確 保 正 常 執 行 的 語 句 不 需 要 代 碼 縮 進 。 < / p >
< p > 要 特 别 註 意 短 變 量 聲 明 語 句 的 作 用 域 范 圍 , 考 慮 下 面 的 程 序 , 它 的 目 的 是 獲 取 當 前 的 工 作 目 録 然 後 保 存 到 一 個 包 級 的 變 量 中 。 這 可 以 本 來 通 過 直 接 調 用 os.Getwd完 成 , 但 是 將 這 個 從 主 邏 輯 中 分 離 出 來 可 能 會 更 好 , 特 别 是 在 需 要 處 理 錯 誤 的 時 候 。 函 數 log.Fatalf用 於 打 印 日 誌 信 息 , 然 後 調 用 os.Exit(1)終 止 程 序 。 < / p >
2015-12-09 07:57:17 +00:00
< pre > < code class = "lang-Go" > < span class = "hljs-keyword" > var< / span > cwd < span class = "hljs-typename" > string< / span >
< span class = "hljs-keyword" > func< / span > init() {
cwd, err := os.Getwd() < span class = "hljs-comment" > // compile error: unused: cwd< / span >
< span class = "hljs-keyword" > if< / span > err != < span class = "hljs-constant" > nil< / span > {
log.Fatalf(< span class = "hljs-string" > " os.Getwd failed: %v" < / span > , err)
}
}
< / code > < / pre >
2015-12-28 08:08:26 +00:00
< p > 雖 然 cwd在 外 部 已 經 聲 明 過 , 但 是 < code > :=< / code > 語 句 還 是 將 cwd和 err重 新 聲 明 爲 新 的 局 部 變 量 。 因 爲 內 部 聲 明 的 cwd將 屏 蔽 外 部 的 聲 明 , 因 此 上 面 的 代 碼 併 不 會 正 確 更 新 包 級 聲 明 的 cwd變 量 。 < / p >
< p > 由 於 當 前 的 編 譯 器 會 檢 測 到 局 部 聲 明 的 cwd併 沒 有 本 使 用 , 然 後 報 告 這 可 能 是 一 個 錯 誤 , 但 是 這 種 檢 測 併 不 可 靠 。 因 爲 一 些 小 的 代 碼 變 更 , 例 如 增 加 一 個 局 部 cwd的 打 印 語 句 , 就 可 能 導 致 這 種 檢 測 失 效 。 < / p >
2015-12-09 07:57:17 +00:00
< pre > < code class = "lang-Go" > < span class = "hljs-keyword" > var< / span > cwd < span class = "hljs-typename" > string< / span >
< span class = "hljs-keyword" > func< / span > init() {
cwd, err := os.Getwd() < span class = "hljs-comment" > // < span class = "hljs-doctag" > NOTE:< / span > wrong!< / span >
< span class = "hljs-keyword" > if< / span > err != < span class = "hljs-constant" > nil< / span > {
log.Fatalf(< span class = "hljs-string" > " os.Getwd failed: %v" < / span > , err)
}
log.Printf(< span class = "hljs-string" > " Working directory = %s" < / span > , cwd)
}
< / code > < / pre >
2015-12-28 08:08:26 +00:00
< p > 全 局 的 cwd變 量 依 然 是 沒 有 被 正 確 初 始 化 的 , 而 且 看 似 正 常 的 日 誌 輸 出 更 是 讓 這 個 BUG更 加 隱 晦 。 < / p >
< p > 有 許 多 方 式 可 以 避 免 出 現 類 似 潛 在 的 問 題 。 最 直 接 的 方 法 是 通 過 單 獨 聲 明 err變 量 , 來 避 免 使 用 < code > :=< / code > 的 簡 短 聲 明 方 式 : < / p >
2015-12-09 07:57:17 +00:00
< pre > < code class = "lang-Go" > < span class = "hljs-keyword" > var< / span > cwd < span class = "hljs-typename" > string< / span >
< span class = "hljs-keyword" > func< / span > init() {
< span class = "hljs-keyword" > var< / span > err error
cwd, err = os.Getwd()
< span class = "hljs-keyword" > if< / span > err != < span class = "hljs-constant" > nil< / span > {
log.Fatalf(< span class = "hljs-string" > " os.Getwd failed: %v" < / span > , err)
}
}
< / code > < / pre >
2015-12-28 08:08:26 +00:00
< p > 我 們 已 經 看 到 包 、 文 件 、 聲 明 和 語 句 如 何 來 表 達 一 個 程 序 結 構 。 在 下 面 的 兩 個 章 節 , 我 們 將 探 討 數 據 的 結 構 。 < / p >
2015-12-09 07:57:17 +00:00
< / section >
< / div >
< / div >
< / div >
< a href = "../ch2/ch2-06.html" class = "navigation navigation-prev " aria-label = "Previous page: 包和文件" > < i class = "fa fa-angle-left" > < / i > < / a >
< a href = "../ch3/ch3.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 >