Go語言官方指南

2023-01-24 08:30:03 字數 5311 閱讀 1353

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 ...