這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
近來由於部門想統一所有項目的服務端開發,即以後所有新開的項目均採用同一套架構,這樣有助於開發人員在參與多項目開發時完成低成本轉換。因此,技術方面通過由技術總監指定了一個同事作為該方面的推動者,推動以後新項目的語言與架構的選型。從目前的意見來看,語言選型可能往go語言方面轉換。因此本人也開始了go的學習。在學習過程中也發現了很多好玩的東西,權作記錄:
一、包的定義與引用
go語言同樣可以像java等語言定義包,但go對於包的定義是有嚴格要求的:
1. 在同一檔案夾下只能定義同一個包的代碼。如以下結構樹中,bubble.go,insert.go等檔案的代碼定義均使用package test_sort
src/
└── test_sort
├── bubble.go
├── insert.go
├── quick.go
└── selection.go
2. 由於go語言的包的路徑檢索是通過GOPATH環境變數來指定的,因此即使是自己開發的包,也必須在GOPATH環境變數中指明才能使用。如使用命令:export GOPATH=$GOPATH:/home/haust/go或者在設定檔裡添加該環境變數,Linux下在使用者根目錄下添加上述語句,Windows下在系統內容變數裡添加GOPATH變數並定義內容或直接修改現有環境變數
3. 所引用的包的目錄必須包含src目錄,並且所有的包均包含在src目錄下才可以正確引用,否則編譯代碼時會提示無法找到包的定義
4. 在代碼中引用包通過import標識符指定,如果是單個包引用,可以直接使用import "fmt"這種方式,但若是多個包則必須使用:
import ( "fmt" import (
"math/rand") 或者"fmt"
"math/rand"
)
即每個包必須換行引用,否則程式將會報錯
二、變數的聲明與賦值
先貼幾行代碼:
var a int a = 3 //a 的先聲明後賦值var b int = 5 //b 在聲明的同時賦值c := 4 //c 聲明且賦值
在上述的三種聲明中,需要特別注意的是賦值符號的區別,對於添加var標誌聲明的變數和使用:=方式生命的變數不盡相同,後續在介紹數組的使用的時候會給大家展示
三、函數的定義
1. 在go中的包裡的函數定義中對外可見函數名首字母必須為大寫字母,其他函數名不做要求,詳見類型的定義
2. 函數定義必須以func標識符開始
3. 函數的傳回值定義在參數列表之後
4. 函數可以有多個傳回值,但多個傳回值時必須用()括起來
5. 在同一個包內,不能出現同名的函數
如:func Retself(a int) int//單傳回值聲明
func Retself(a int, b int) (int, int)//多傳回值聲明
四、類型定義
在go中雖然沒有類,但還是同樣會有類型定義,該類型的定義方式類同C++的類,但少有區別,如下:
type Rect struct {
width, height int
}
1. 類型的初始化是非常簡單的,在類型名的後面使用{}包住初始化列表即可。在go中支援兩種方式初始化
(1)具名初始化,如 rect := Rect{width:3, height:4}。這種初始化比較簡單也比較容易理解
(2)匿名初始化,如 rect := Rect{3, 4}。這種初始化方式是按照初始化列表和類型的成員一一對應初始化的,即產生的結果是width = 3, height = 4
2. 類型成員函數的定義
在go的類型定義中,同樣支援成員函數,以下為例:
func (rect Rect) area() int {
return rect.width * rect.height
}
其調用方式很簡單:即 rect.area()調用即可
五、介面定義
定義參考如下:
type Shape interface { perim() int}type Rect struct { width, height int}type Trian struct { a, b, c int}func (r Rect) perim() int { return 2*width + 2*height}func (t Trian) perim() int { return a + b + c}
在使用中也是異常簡單的,如下:
func CalcPerim(s Shape) int { return s.perim()}func main() { rect := Rect{3, 4} trian := Trian{1, 2, 3} CalcPerim(rect) CalcPerim(trian)}