make loop

This commit is contained in:
chai2010
2015-12-26 20:05:30 +08:00
parent 82ec0c025d
commit e15e88dad7
74 changed files with 207 additions and 207 deletions

View File

@@ -1,6 +1,6 @@
## 1.2. 命令行參數
大多數的程序都是處理輸入,産生輸;這也正是“計算”的定義。但是一個程序要如何穫取輸入呢?一些程序會生成自己的數據,但通常情況下,輸入都來自於程序外部:比如文件、網絡連接、其它程序的輸、用戶的鍵盤、命令行的參數或其它類似輸入源。下面幾個例子會討論其中的一些輸入類型,首先是命令行參數。
大多數的程序都是處理輸入,産生輸;這也正是“計算”的定義。但是一個程序要如何穫取輸入呢?一些程序會生成自己的數據,但通常情況下,輸入都來自於程序外部:比如文件、網絡連接、其它程序的輸、用戶的鍵盤、命令行的參數或其它類似輸入源。下面幾個例子會討論其中的一些輸入類型,首先是命令行參數。
os這個package提供了操作繫統無關跨平颱與繫統交互的一些函數和相關的變量運行時程序的命令行參數可以通過os包中一個叫Args的這個變量來穫取當在os包外部使用該變量時需要用os.Args來訪問。
@@ -8,7 +8,7 @@ os.Args這個變量是一個字符串string的slice譯註slice和Pyt
os.Args的第一個元素卽os.Args[0]是命令行執行時的命令本身其它的元素則是執行該命令時傳給這個程序的參數。前面提到的切片表達式s[m:n]會返迴第m到第n-1個元素所以下一個例子里需要用到的os.Args[1:len(os.Args)]卽是除了命令本身外的所有傳入參數。如果我們省略s[m:n]里的m和n那麽默認這個表達式會填入0:len(s)所以這里我們還可以省略掉n寫成os.Args[1:]。
下面是一個Unix里echo命令的實現這個命令會在單行內打印命令行參數。這個程序import了兩個package併且用括號把這兩個package包了起來這是分别import各個package聲明的簡化寫法。當然了你分開來寫import也沒有什麽問題隻是一般爲了方便我們都會像下面這樣來導入多個package。我們自己寫的導入順序併不重要因爲gofmt工具會幫助我們按照字母順序來排列好這些導入包名。本書中如果一個例子有多種版本時我們會用編號標記來)
下面是一個Unix里echo命令的實現這個命令會在單行內打印命令行參數。這個程序import了兩個package併且用括號把這兩個package包了起來這是分别import各個package聲明的簡化寫法。當然了你分開來寫import也沒有什麽問題隻是一般爲了方便我們都會像下面這樣來導入多個package。我們自己寫的導入順序併不重要因爲gofmt工具會幫助我們按照字母順序來排列好這些導入包名。本書中如果一個例子有多種版本時我們會用編號標記來)
```go
gopl.io/ch1/echo1
@@ -56,7 +56,7 @@ s = s + sep + os.Args[i]
運算符+=是一個賦值運算符(assignment operator),每一種數值和邏輯運算符,例如*或者+都有其對應的賦值運算符。
echo程序可以每循環一次輸一個參數不過我們這里的版本是不斷地將其結果連接到一個字符串的末尾。s這個字符串在聲明的時候是一個空字符串而之後循環每次都會被在末尾添加一段字符串第一次迭代之後一個空格會被插入到字符串末尾所以每插入一個新值都會和前一個中間有一個空格隔開。這是一種非線性的操作當我們的參數數量變得龐大的時候當然不是説這里的echo一般echo也不會有太多參數其運行開銷也會變得龐大。下面我們會介紹一繫列的echo改進版來應對這里説到的運行效率低下。
echo程序可以每循環一次輸一個參數不過我們這里的版本是不斷地將其結果連接到一個字符串的末尾。s這個字符串在聲明的時候是一個空字符串而之後循環每次都會被在末尾添加一段字符串第一次迭代之後一個空格會被插入到字符串末尾所以每插入一個新值都會和前一個中間有一個空格隔開。這是一種非線性的操作當我們的參數數量變得龐大的時候當然不是説這里的echo一般echo也不會有太多參數其運行開銷也會變得龐大。下面我們會介紹一繫列的echo改進版來應對這里説到的運行效率低下。
在for循環中我們用到了i來做下標索引可以看到我們用了:=符號來給i進行初始化和賦值這是var xxx=yyy的一種簡寫形式Go語言會根據等號右邊的值的類型自動判斷左邊的值類型下一章會對這一點進行詳細説明。
@@ -141,17 +141,17 @@ func main() {
}
```
最後,如果我們對輸的格式也不是很關心,隻是想簡單地輸值得的話還可以像下面這麽寫Println函數會爲我們自動格式化輸
最後,如果我們對輸的格式也不是很關心,隻是想簡單地輸值得的話還可以像下面這麽寫Println函數會爲我們自動格式化輸
```go
fmt.Println(os.Args[1:])
```
這個輸結果和前面的string.Join得到的結果很相似隻是被自動地放到了一個方括號里對slice調用Println函數都會被打印成這樣形式的結果。
這個輸結果和前面的string.Join得到的結果很相似隻是被自動地放到了一個方括號里對slice調用Println函數都會被打印成這樣形式的結果。
**練習 1.1** 脩改echo程序使其能夠打印os.Args[0]。
**練習 1.2** 脩改echo程序使其打印value和index每個value和index顯示一行。
**練習 1.3** 上手實踐前面提到的strings.Join和直接Println併觀察輸結果的區别。
**練習 1.3** 上手實踐前面提到的strings.Join和直接Println併觀察輸結果的區别。