
基礎(chǔ)篇
一開始,將學(xué)習(xí) Go 程序的基本組件:包、變量和函數(shù)。
包
每個 Go 程序都是由包組成的。
程序運行的入口是包?main?。
這個程序使用并導(dǎo)入了包?"fmt"?和?"math/rand"?。
按照慣例,包名與導(dǎo)入路徑的最后一個目錄一致。例如,"math/rand"?包由?package rand?語句開始。
注意:這個程序的運行環(huán)境是確定性的,因此?rand.Intn?每次都會返回相同的數(shù)字。 (為了得到不同的隨機數(shù),需要提供一個隨機數(shù)種子)
導(dǎo)入
這個代碼用圓括號組合了導(dǎo)入,這是“打包”導(dǎo)入語句。
同樣可以編寫多個導(dǎo)入語句,例如:
import?"fmt" import?"math"
不過使用打包的導(dǎo)入語句是更好的形式。
import?(?????????????? "fmt" "math" )
在 Go 中,首字母大寫的名稱是被導(dǎo)出的。
在導(dǎo)入包之后,你只能訪問包所導(dǎo)出的名字,任何未導(dǎo)出的名字是不能被包外的代碼訪問的。
Foo?和?FOO?都是被導(dǎo)出的名稱。名稱?foo?是不會被導(dǎo)出的。
函數(shù)
函數(shù)可以沒有參數(shù)或接受多個參數(shù)。
在這個例子中,?add?接受兩個?int?類型的參數(shù)。
注意類型在變量名?之后?。

當(dāng)兩個或多個連續(xù)的函數(shù)命名參數(shù)是同一類型,則除了最后一個類型之外,其他都可以省略。
在這個例子中 ,
x?int,?y?int
被縮寫為
x,?y?int
多值返回
函數(shù)可以返回任意數(shù)量的返回值。
swap?函數(shù)返回了兩個字符串。

命名返回值
Go 的返回值可以被命名,并且就像在函數(shù)體開頭聲明的變量那樣使用。
返回值的名稱應(yīng)當(dāng)具有一定的意義,可以作為文檔使用。
沒有參數(shù)的?return?語句返回各個返回變量的當(dāng)前值。這種用法被稱作“裸”返回。
直接返回語句僅應(yīng)當(dāng)用在像下面這樣的短函數(shù)中。在長的函數(shù)中它們會影響代碼的可讀性。

變量
var?語句定義了一個變量的列表;跟函數(shù)的參數(shù)列表一樣,類型在后面。
就像在這個例子中看到的一樣,?var?語句可以定義在包或函數(shù)級別。

初始化變量
變量定義可以包含初始值,每個變量對應(yīng)一個。
如果初始化是使用表達(dá)式,則可以省略類型;變量從初始值中獲得類型。

短聲明變量
在函數(shù)中,?:=?簡潔賦值語句在明確類型的地方,可以用于替代?var?定義。
函數(shù)外的每個語句都必須以關(guān)鍵字開始(?var?、?func?、等等),?:=?結(jié)構(gòu)不能使用在函數(shù)外。

基本類型
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
這個例子演示了具有不同類型的變量。 同時與導(dǎo)入語句一樣,變量的定義“打包”在一個語法塊中。
int,uint?和?uintptr?類型在32位的系統(tǒng)上一般是32位,而在64位系統(tǒng)上是64位。當(dāng)你需要使用一個整數(shù)類型時,你應(yīng)該首選?int,僅當(dāng)有特別的理由才使用定長整數(shù)類型或者無符號整數(shù)類型。

零值
變量在定義時沒有明確的初始化時會賦值為?零值?。
零值是:
數(shù)值類型為?0?,
布爾類型為?false?,
字符串為?""?(空字符串)。

類型轉(zhuǎn)換
表達(dá)式?T(v)?將值?v?轉(zhuǎn)換為類型?T?。
一些關(guān)于數(shù)值的轉(zhuǎn)換:
var?i?int?=?42 var?f?float64?=?float64(i) var?u?uint?=?uint(f)
或者,更加簡單的形式:
i?:=?42 f?:=?float64(i) u?:=?uint(f)
與 C 不同的是 Go 的在不同類型之間的項目賦值時需要顯式轉(zhuǎn)換。 試著移除例子中?float64?或?int?的轉(zhuǎn)換看看會發(fā)生什么。

類型推導(dǎo)
在定義一個變量卻并不顯式指定其類型時(使用?:=?語法或者?var =?表達(dá)式語法), 變量的類型由(等號)右側(cè)的值推導(dǎo)得出。
當(dāng)右值定義了類型時,新變量的類型與其相同:
var?i?int j?:=?i?//?j?也是一個?int
但是當(dāng)右邊包含了未指名類型的數(shù)字常量時,新的變量就可能是?int?、?float64?或?complex128。 這取決于常量的精度:
i?:=?42???????????//?int f?:=?3.142????????//?float64 g?:=?0.867?+?0.5i?//?complex128
嘗試修改演示代碼中?v?的初始值,并觀察這是如何影響其類型的。

常量
常量的定義與變量類似,只不過使用?const?關(guān)鍵字。
常量可以是字符、字符串、布爾或數(shù)字類型的值。
常量不能使用?:=?語法定義。

數(shù)值常量
數(shù)值常量是高精度的?值?。
一個未指定類型的常量由上下文來決定其類型。
也嘗試一下輸出?needInt(Big)?吧。
(int?可以存放最大64位的整數(shù),根據(jù)平臺不同有時會更少。)

◆??◆??◆ ?◆??◆??
來源:
作者介紹:張洋銘,投資人中最懂動漫的程序員,負(fù)責(zé)PlugandPlay早期科技類項目投資,個人關(guān)注動漫智能助理。
微信公眾號:張洋銘Ocean(ocean_anidata)
BP請投遞至:ocean.zhang@plugandplaychina.com