谷歌系統所使用的編程語言Go,近年來發展的越來越成熟、方便易用?,F在,我們可以通過使用LiteIDE讓Go語言編程變得更加簡單。
第一步 語言基礎
數據、類型、函數、控制
Go語言是一個很容易上手同時功能無比強大的編程語言。你可以將它看做是C的現代版,至于更多的東西,還有待你自己去發掘。Go語言有著清晰簡明的靜態語法結構,但它表現出來的確是一種動態的效果。它還可以編譯成本地代碼,但卻像解釋性語言那樣去工作。
總的來說,Go語言是一門完全值得你去嘗試的語言,同時本文將告訴你一切你上手這門語言所需要知識。在第二部分,我們將重點分析Go語言是如何處理對象和并發的。
安裝
安裝和配置Go語言,你只需要下載合適的二進制文件至正確的位置,再為Go工具定位那些文件所在的目錄路徑就好了。
如果你使用的是OSX或Windows操作系統,那么你可以使用安裝包來完成這一些列工作。
在Windows下,我推薦MSI安裝包,這個安裝包雖然還在試驗中,但其實它的表現非常不錯,它能迅速地為你完成配置工作。 你需要的只是根據你的系統下載32位或64位安裝包然后在你的電腦上運行就好了。
安裝程序會默認在C:/Go目錄進行安裝。
你可以通過下面的小程序驗證環境是否搭建完成:
你可以使用記事本或其他文本編輯器編輯上面這段代碼,并將代碼保存為hello.go文件。然后打開終端,輸入:
go run hello.go
接下來你就可以進行LiteIDE的安裝并嘗試運行程序了。
不管從什么方面來說,LiteIDE并不是編寫Go程序的必備工具,你所需要的只是一個編輯器而已。這樣說的確沒錯,但是對于一個新人,一個好的IDE可以使他更容易上手一門語言,并迅速投入開發。
美中不足的是,LiteIDE沒有使用手冊。
你可以從下面的網址上下載tar或zip壓縮包
https://code.google.com/p/golangide/
下載完成后將其解壓至合適的目錄。如果你是用的是Windows,那你可能需要使用7z來解壓。
如此簡潔的安裝過程必然不會為你創建快捷方式,因此你可能需要打開.../liteide/bin然后找到liteide.exe并手動創建快捷方式。
打開LiteIDE后你會看到歡迎界面:
現在我們暫時無需理會這些組件,讓我們先從一個簡單的小程序開始。
在工具欄上選擇File->New或直接在歡迎界面上點擊New按鈕,在彈出的對話框中選擇Go1 Command Project。LiteIDE將為你創建一個Go控制臺工程,工程目錄放在C:/Go/src下。如果你為你的項目起名Hello,那你的代碼文件將被放在 C:/Go/src/Hello下。
你可以點擊工具欄上藍色的編譯執行按鈕BR運行代碼。你可以在在Build菜單中的B和BR按鈕菜單中找到更多的關于編譯和執行代碼的命令。
如果你運行了你的程序,你可以在底部的編譯輸出(Build Output)窗口中看到程序運行結果。
如果程序沒有運行,那么很有可能是你創建的工程類型不對或者文件路徑錯誤。
LiteIDE中還有很多功能等待你去發掘,不過目前為止的這些已經足夠我們使用Go語言了。
變量和簡單數據類型
Go語言包含了你所期望的所有從uint8 到 float64的簡單數據類型。
最大的驚喜就在于,Go語言支持復數類型的數據:
如果你想知道rune是什么,那么當你知道rune被用來存儲一個Unicode字符的時候,這個問題也就應該迎刃而解了吧。換句話說,rune在Go語言中等價于字符(char)類型。
當然你也可以使用uint、int卷二uintptr這些依賴于系統類型(32位或64位)的整數類型。
另外一個新穎的地方,當你定義一個變量的時候,你變量的后面對其類型進行定義,而不是在前面。
當你在定義中初始化了變量,你無需對變量指定數據類型。如果在定義的時候未初始化,則變量將會被賦予0值:
var i=0
var x,y float32=1.0,2.0
和數字類型一樣,Boolean 類型也有相似的特征。
編譯器會完成相應的工作。
一個使用Go語言定義和初始化變量的簡單例子:
x,y:=1,2
你也可以定義和使用常量。
數據結構
常用的數據結構有字符串(strings),數組(arrays)和結構體(structs),以及另一位頗受歡迎的成員map。
字符串是Unicode編碼,其值不能修改,而其他方面和你想的差不多。
s="Hello"
可以使用len函數獲取字符串的長度,使用索引操作符[0]可以訪問字符串中的字符。Go語言中的字符串類型相當簡陋,但使用stirng package可以實現類似其他語言字符串的所有功能。
數組(arrays)以中括號([])聲明,索引從零開始。例如:
多維數組通過數組的數組實現,
數組(array)不是動態的,不能動態分配大小。但可以使用切片(slice)實現同樣的效果。切片包含數組(array)的一部分,可以動態變更大小。
結構體(structs)與其他語言類似,如下:
上例聲明了新的結構體類型,包括兩個成員x和y。在main函數中創建并初始化了該結構體類型的實例(instance)。Go語言通常不使用術語“實例(instance)”,而更喜歡使用術語“值(value)”,所以你是創建了該類型的一個值(value)。
結構體定義中可以嵌套結構體作為成員。初始化器(initializer){10,10}是結構體literal(譯注:literal可以理解為立即數,見維基)。在結構體literal中也可以使用成員名例如{X:10}。
這是我們首次介紹Go類型,關于這個話題之后還有更多內容。
最后一個數據類型是Map,等價于其他語言中的hash map,關聯數組(associative array)或者字典(dictionary)。
給定鍵的類型以及值的類型就能創建Map。如果從來沒有使用過關聯數組,那就把它想象成一個數組,數組的值不是通過索引訪問,而是通過通用類型的鍵訪問。例如。:
顯示結果是30.
make函數是能夠基于Type(類型)創建Value(值)(譯注:可以理解為實例)的兩個函數之一,要詳細了解它,我們需要學習更多關于類型的內容。
類型
在Go語言中,類型特指一系列的值和操作。Go語言的類型起到的作用與眾所周知的面向對象的設計語言(Java、C++)有很大的不同,它沒有所謂的層次劃分、沒有類的概念也不存在繼承。類型是可以被推斷出來的,如:Go使用鴨子類型。
你可以用一個立即數(literal )或指定的類型來定義一個類型變量,以達到類型重用的目的。
自定義類型是由一些小的數據類型整合而成的,如數組、結構體、指針、很熟、接口、片、map和channel。
定義類型的方法:
type 類型名 數據類型
例:
type myint int
定義myint為一個整型類型。如果你想創建一個擴展類型,重新定義之前聲明過的類型的數據類型也很常用,實現的函數和方法我們之后再講。
更為通常的做法,你可以使用某些數據類型組成你自定義的類型:
你也可以聲明數組類型:
type myarray [20]int
你可以在定義類型時使用自定義類型:
這就創建了一個point類型的數組。
你可以自行探索其他的類型定義方式。接下來我們要做的是理解Go能用這些類型完成什么工作?
類型主要被用于下面兩個方面:
類型檢測
和
創建值
類型檢測很常見——你只能賦予你定義的變量與之相同類型的值。在編譯時編譯器會依此對靜態類型進行檢查。
例:
上面的代碼編譯將不會通過。但下面的代碼:
將會通過編譯。因為“c”和“1”都是整型數據。
類型所做的第二件事:在你用類型聲明變量時構造對應類型的變量。如:
var i int
或
var p point
但對于slice(片)、map和channel來說他們必須使用make函數創建對應類型的值。
make函數是Go語言支持的兩個分配函數中的一個,另一個是new函數。make函數創建了一個指定類型的值,并把該值得指針返回給變量。在大多數地方,Go中的指針與C中的指針使用方法類似。
你可以使用*引用一個指針的值,也可以用&獲取值得地址。但是,Go和C的指針也存在差異,這種區別在于Go語言不存在指針計算。在Go語言中,指針存在的意義是讓你可以用引用的方式在函數之間傳遞參數。 如果你有一個類型T,那么*T就是一個指向類型T的指針。
舉一個new函數的例子:
在這里,new函數創建了一個整型變量并放回了它的地址存放在add中。變量add的類型為*int。
如果你寫出如下語句
那么你將得到這個整型值得地址。那么,為了打印這個整型變量的值,我們需要這樣書寫打印語句:
就像之前提到過的那樣,你可以直接使用類型的值而無需給這個類型命名:
如果你不需要重用這個類型,那么這樣做也是可以的。
函數
Go不是一種基于類并且有層次結構的語言,也不使用通常的方式處理對象。如果你僅僅打算實現一個函數,那就不用考慮有關對象的內容。函數就是一個值(Values),是“一等對象“。
如下,聲明一個函數
可以指定參數類型和返回值類型,如果指定了返回值類型,則函數中必須有return語句。
函數值(value)被賦值給了變量myFunc。也可以按照通常的方式定義函數,這是變量myFunc就是函數的名稱。
無論那種方式,函數都可以使用下面的方式調用:
可以在return語句中返回多個值,并且可以在函數頭中指定返回值的名稱。
例如:
返回多個值也很簡單:
傳值——指針
所有的形參都是以傳值的方式傳入,所以對形參做的任何改變都不會影響實參。例如:
顯示結果是4和2。x的值沒有變化。
如果想要改變實參的值,就需要傳入指針(譯注:即傳地址或傳引用)作為參數。例如,變更函數定義如下:
現在顯示結果是4和1,x的值變更了。
*和&操作符的用法對C程序員來說是非常熟悉的,這體現了Go語言較為初級的一面。有爭議說在現代語言中所有的參數都應該以傳引用的方式傳入。
如果函數定義中的參數是*int類型,而調用該函數時沒有使用&操作數,那么在編譯階段類型檢查時就會報錯,而C語言沒有這個功能。
總之,Go語言的指針類型,可以作為實參傳遞給函數,但無法在數據上耍一些”聰明“的技巧。
作用域和閉包
你可以以嵌套的方式在函數中定義函數。在某塊代碼中定義的變量只會在該塊代碼區域和該代碼區域內的區域生效。這意味著你可以在函數之外定義全局變量,那么所有的函數將都能使用這個變量。
例:
在這個例子中,a1是一個全局變量,可以被所有函數訪問。a2在main函數內定義,因此它可以被main函數和main中的myFunc函數訪問。
Go同樣支持閉包。如果你在一個函數中定義了另一個函數,那么這個在內部的函數將能夠訪問外部函數的變量,即使外部函數已經終止運行。在外部函數停止后保持內部函數的唯一方法是將其作為一個返回值返回給外部函數。
例:
在這里,內部函數以func() int的方式返回給外部函數。函數和它的內容都是以類型的方式返回的。返回的函數將會返回外部函數定義的變量的值,這就是閉包的作用。
因此
輸出結果為 1.
每個閉包都有一份與自己綁定的變量副本,閉包不會實現不同函數副本之間的數據共享。
Go 控制
現在我們已經了解過了數據、類型和函數。接下來我們將討論另一個重要的問題:Go語言提供的控制語句。
實際上,Go語言只提供了很少的控制結構,它極大簡化了控制語句的使用。
Go語言是一種塊結構的編程語言,它使用"{}"將一組代碼組成塊。如果你一直在奇怪其他編程語言中經常使用的“;”去了哪里,我可以很明確的告訴你,在Go中它依然存在,只是在編譯過程中它會自動為你加上“;”。如果你也在代碼末尾加上分號,那么編譯器將會認為它們是不需要的字符,從而自動剔除這些分號。
for循環是Go語言中的唯一一種循環。for循環可以被用來創建條件循環和枚舉循環。
for循環具有下面這種形式:
新聞熱點
疑難解答
圖片精選