go 指南
hello, 世界
go 程式語言指南。
該指南被分為三個部分:基礎概念、方法和介面,以及併發。
在指南後有若干個練習需要讀者完成。
該指南可以進行互動。點選「執行」按鈕(或按 shift + enter)可以在遠端伺服器上編譯並執行程式。 結果展示在**的下面。
這些例子程式展示了 go 的各個方面。在指南中的程式可以成為你積累經驗的開始。
編輯程式並且再次執行它。
當你準備好繼續了,點選「向後」按鈕或按 pagedown 鍵。
go 本地化
該指南也有其他語言版本:
brazilian portuguese — português do brasil
catalan — català
hebrew —
japanese — 日本語
romanian - romn
chinese — 普通話
點選「向後」按鈕或者按 pagedown 繼續。
包每個 go 程式都是由包組成的。
程式執行的入口是包 `main`。
這個程式使用並匯入了包 "fmt" 和 `"math"`。
按照慣例,包名與匯入路徑的最後乙個目錄一致。
匯入這個**用圓括號組合了匯入,這是「factored」匯入語句。同樣可以編寫多個匯入語句,例如:
import "fmt"
import "math"
匯出名在匯入了乙個包之後,就可以用其匯出的名稱來呼叫它。
在 go 中,首字母大寫的名稱是被匯出的。
foo 和 foo 都是被匯出的名稱。名稱 foo 是不會被匯出的。
執行**。然後將 改名為 再試著執行一下。
函式函式可以沒有引數或接受多個引數。
在這個例子中,`add` 接受兩個 int 型別的引數。
注意型別在變數名 _之後_。
(參考這篇關於 go 語法定義的文章了解型別以這種形式出現的原因。)
函式(續)
當兩個或多個連續的函式命名引數是同一型別,則除了最後乙個型別之外,其他都可以省略。
在這個例子中 ,
x int, y int
被縮寫為
x, y int
多值返回
函式可以返回任意數量的返回值。
這個函式返回了兩個字串。
命名返回值
函式接受引數。在 go 中,函式可以返回多個「結果引數」,而不僅僅是乙個值。它們可以像變數那樣命名和使用。
如果命名了返回值引數,乙個沒有引數的 return 語句,會將當前的值作為返回值返回。
變數var 語句定義了乙個變數的列表;跟函式的引數列表一樣,型別在後面。
初始化變數
變數定義可以包含初始值,每個變數對應乙個。
如果初始化是使用表示式,則可以省略型別;變數從初始值中獲得型別。
短宣告變數
在函式中,`:=` 簡潔賦值語句在明確型別的地方,可以用於替代 var 定義。
(`:=` 結構不能使用在函式外,函式外的每個語法塊都必須以關鍵字開始。)
基本型別
go 的基本型別有basic types
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8 的別名
rune // int32 的別名
// 代表乙個unicode碼
float32 float64
complex64 complex128
常量常量的定義與變數類似,只不過使用 const 關鍵字。
常量可以是字元、字串、布林或數字型別的值。
數值常量
數值常量是高精度的 _值_。
乙個未指定型別的常量由上下文來決定其型別。
也嘗試一下輸出 needint(big) 吧。
forgo 只有一種迴圈結構——`for` 迴圈。
基本的 for 迴圈除了沒有了 `( )` 之外(甚至強制不能使用它們),看起來跟 c 或者 j**a 中做的一樣,而 `` 是必須的。
for(續)
跟 c 或者 j**a 中一樣,可以讓前置、後置語句為空。
for 是 go 的 「while」
基於此可以省略分號:c 的 while 在 go 中叫做 `for`。
死迴圈如果省略了迴圈條件,迴圈就不會結束,因此可以用更簡潔地形式表達死迴圈。
ifif 語句除了沒有了 `( )` 之外(甚至強制不能使用它們),看起來跟 c 或者 j**a 中的一樣,而 `` 是必須的。
(耳熟嗎?)
if 的便捷語句
跟 for 一樣,`if` 語句可以在條件之前執行乙個簡單的語句。
由這個語句定義的變數的作用域僅在 if 範圍之內。
(在最後的 return 語句處使用 v 看看。)
if 和 else
在 if 的便捷語句定義的變數同樣可以在任何對應的 else 塊中使用。
練習:迴圈和函式
作為練習函式和迴圈的簡單途徑,用牛頓法實現開方函式。
在這個例子中,牛頓法是通過選擇乙個初始點 z 然後重複這一過程求 sqrt(x) 的近似值:
為了做到這個,只需要重複計算 10 次,並且觀察不同的值(1,2,3,……)是如何逐步逼近結果的。 然後,修改迴圈條件,使得當值停止改變(或改變非常小)的時候退出迴圈。觀察迭代次數是否變化。
結果與 [[ 接近嗎?
提示:定義並初始化乙個浮點值,向其提供乙個浮點語法或使用轉換:
z := float64(1)
z := 1.0
結構體乙個結構體(`struct`)就是乙個欄位的集合。
(而 type 的含義跟其字面意思相符。)
結構體欄位
結構體欄位使用點號來訪問。
指標go 有指標,但是沒有指標運算。
結構體欄位可以通過結構體指標來訪問。通過指標間接的訪問是透明的。
結構體文法
結構體文法表示通過結構體字段的值作為列表來新分配乙個結構體。
使用 name: 語法可以僅列出部分字段。(欄位名的順序無關。)
特殊的字首 & 構造了指向結構體文法的指標。
new 函式
表示式 new(t) 分配了乙個零初始化的 t 值,並返回指向它的指標。
var t *t = new(t)
或t := new(t)
slice
slice 指向乙個陣列,並且包含了長度資訊。
t 是乙個元素型別為 t 的 slice。
對 slice 切片
slice 可以重新切片,建立乙個新的 slice 值指向相同的陣列。
表示式s[lo:hi]
表示從 lo 到 hi-1 的 slice 元素,含兩端。因此
s[lo:lo]
是空的,而
s[lo:lo+1]
有乙個元素。
構造 slice
slice 由函式 make 建立。這會分配乙個零長度的陣列並且返回乙個 slice 指向這個陣列:
a := make(int, 5) // len(a)=5
為了指定容量,可傳遞第三個引數到 `make`:
b := make(int, 0, 5) // len(b)=0, cap(b)=5
b = b[:cap(b)] // len(b)=5, cap(b)=5
b = b[1len(b)=4, cap(b)=4
空 slice
slice 的零值是 `nil`。
乙個 nil 的 slice 的長度和容量是 0。
(了解更多關於 slice 的內容,參閱文章[[使用和內幕]]。)
range
for 迴圈的 range 格式可以對 slice 或者 map 進行迭代迴圈。
range(續)
可以將值賦值給 _ 來忽略序號和值。
如果只需要索引值,去掉「, value」的部分即可。
練習:slice
實現 `pic`。它返回乙個 slice 的長度 `dy`,和 slice 中每個元素的長度的 8 位無符號整數 `dx`。當執行這個程式,它會將整數轉換為灰度(好吧,藍度)**進行展示。
**的實現已經完成。可能用到的函式包括 >x^y , (x+y)/2 和 `x*y`。
(需要使用迴圈來分配 uint8 中的每個 `uint8`。)
(使用 uint8(intvalue) 在型別之間進行轉換。)
mapmap 對映鍵到值。
map 在使用之前必須用 make 而不是 new 來建立;值為 nil 的 map 是空的,並且不能賦值。
map 的文法
map 的文法跟結構體文法相似,不過必須有鍵名。
map 的文法(續)
如果頂級的型別只有型別名的話,可以在文法的元素中省略鍵名。
修改 map
在 map m 中插入或修改乙個元素:
m[key] = elem
獲得元素:
elem = m[key]
刪除元素:
delete(m, key)
通過雙賦值檢測某個鍵存在:
elem, ok = m[key]
如果 key 在 m 中,`ok` 為 true 。否則, ok 為 `false`,並且 elem 是 map 的元素型別的零值。
同樣的,當從 map 中讀取某個不存在的鍵時,結果是 map 的元素型別的零值。
練習:map
實現 `wordcount`。它應當返回乙個含有 s 中每個 「詞」 個數的 map。函式 針對這個函式執行乙個測試用例,並列印成功或者失敗。
你會發現 很有幫助。
函式為值
函式也是值。function values
函式的閉包
並且函式是完全閉包的。
函式 adder 返回乙個閉包。每個閉包被繫結到了特定的 sum 變數上。
練習:斐波納契閉包
現在來通過函式做些有趣的事情。
實現乙個 fibonacci 函式,返回乙個函式(乙個閉包)可以返回連續的斐波納契數。
switch
你可能已經猜到 switch 可能的形式了。
除非使用 fallthrough 語句作為結尾,否則 case 部分會自動終止。
switch 的執行順序
switch 的條件從上到下的執行,當匹配成功的時候停止。
(例如,
switch i
當 i==0 時不會呼叫 `f`。)
注意:go playground 中的時間總是從 2009-11-10 23:00:00 utc 開始, 如何校驗這個值作為乙個練習留給讀者完成。
鑑賞詩歌語言解題指津
鑑賞詩歌語言是高考考查的乙個重點,學生在做題時,經常會有這麼一種情況,讀懂了一首詩,但卻不知道如何去表述,怎樣的表述比較完整,或者直接說更容易得到分數。為此,我們必須指導學生,把握規律,走出迷津。例1 華子崗 裴迪 日落松風起,還家草露唏。雲光侵履跡,山翠拂人衣。請談談 侵 拂 兩個字的妙處。析 侵...
C語言程式設計實驗報告實驗7指標
實驗報告 實驗目的 1 掌握指標的定義和指標的運算 2 掌握用指標處理變數和陣列 二 實驗內容 實驗7 1 編寫函式用指標實現兩個數的交換。在主函式中實現呼叫 1 程式 include void e int m,int n void main void e int a,int b 2 執行結果 實驗...
c語言實驗報告12指標與陣列的關係
物光學院計算機類實驗報告 c 程式設計 課程實驗報告 學院班級姓名 學號實驗裝置 計算機1臺實驗日期 2011年3月1日實驗專案名稱 指標與陣列的關係實驗目的 1 掌握指標變數的定義與引用。2 掌握指標與變數 指標與陣列的關係。實驗要求 能夠利用指標變數應用陣列編寫簡單程式。實驗內容 包括步驟 1 ...