Go學習筆記(1)Go語言介紹

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

 

Go 語言介紹

兩個例子程式。

1. Go語言起源

Go 語言起源 2007 年,並於 2009 年正式對外發布。它從 2009 年 9 月 21 日開始作為Google公司 20% 兼職項目,即相關員工利用 20% 的空餘時間來參與 Go 語言的研發工作。該項目的三位領導者均是著名的電腦工程師:Robert Griesemer,參與開發 Java HotSpot 虛擬機器;Rob Pike,Go 語言項目總負責人,貝爾實驗室 Unix 團隊成員,參與的項目包括 Plan 9,Inferno 作業系統和 Limbo 程式設計語言;Ken Thompson,貝爾實驗室 Unix 團隊成員,C 語言、Unix 和 Plan 9 的創始人之一,與 Rob Pike 共同開發了 UTF-8 字元集規範。2009 年 11 月 10 日,Team Dev將 Go 語言項目以 BSD-style 授權(完全開源)正式公布了 Linux 和 Mac OS X 平台上的版本。Hector Chu 於同年 11 月 22 日公布了 Windows 版本。

作為一個開源項目,Go 語言藉助開源社區的有生力量達到快速地發展,並吸引更多的開發人員來使用並改善它。自該開源項目發布以來,超過 200 名非Google員工的貢獻者對 Go 語言核心部分提交了超過 1000 個修改建議。在過去的 18 個月裡,又有 150 開發人員貢獻了新的核心代碼。這儼然形成了世界上最大的開源團隊,並使該項目躋身 Ohloh 前 2% 的行列。大約在 2011 年 4 月 10 日,Google開始抽調員工進入全職開發 Go 語言項目。開源化的語言顯然能夠讓更多的開發人員參與其中並加速它的發展速度。在 Go 語言在 2010 年 1 月 8 日被 Tiobe(聞名於它的程式設計語言流行程度排名)宣布為“2009 年年度語言”後,引起各界很大的反響。目前 Go 語言在這項排名中的最高記錄是在 2010 年 2 月創下的第13名,流行程度 1.778%。

2. Go語言的特性

Go 語言將靜態語言的安全性和高效性與動態語言的易開發性進行有機結合,達到完美平衡,從而使編程變得更加有樂趣,而不是在艱難抉擇中痛苦前行。因此,Go 語言是一門型別安全和記憶體安全的程式設計語言。雖然 Go 語言中仍有指標的存在,但並不允許進行指標運算。

Go 語言對網路通訊、並發和並行編程有著極佳的支援,這能更好地利用大量的多核電腦。設計者通過 goroutine 這種輕量級線程的概念來實現這個目標,然後通過 channel 來實現各個 goroutine 之間的通訊。這個特性是 Go 語言最強有力的部分,不僅支援了日益重要的多核與多處理器電腦,也彌補了現存程式設計語言在這方面所存在的不足。

Go 語言中另一個非常重要的特性就是它的構建速度(編譯和連結到機器代碼的速度),一般情況下構建一個程式的時間只需要數百毫秒到幾秒。這不僅極大地提升了開發人員的生產力,同時也使得軟體開發過程中的代碼測試環節更加緊湊,而不必浪費大量的時間在等待程式的構建上。

由於記憶體問題(通常稱為記憶體流失)長期以來一直伴隨著 C++ 的開發人員們,Go 語言的設計者們認為記憶體管理不應該是開發人員所需要考慮的問題。因此儘管 Go 語言像其它靜態語言一樣執行本地代碼,但它依舊運行在某種意義上的虛擬機器,以此來實現高效快速的記憶體回收。

有許多活躍的開源項目都是基於Go語言進行開發,目前十分流行的Docker也是基於Go語言進行開發。在正式開始學習Go之前,讓我們先嘗試幾個例子,直觀感受下Go語言。

三. 樣本一 Hello World

1. 原始碼

第一個例子當然是HelloWorld了,使用Vim編輯原始碼:

$ gvim hello.go

輸入以下代碼儲存

package main

 

import (

    "fmt"

    "os"

)

 

func main() {

    target := "World"

    if len(os.Args) > 1 { /* os.Args是一個參數切片 */

        target = os.Args[1]

    }

    fmt.Println("Hello", target)

}

2. 說明

Go語言使用C++風格的注釋://表示單行注釋,到行尾結束,/*...*/表示多行注釋。所有的Go語言代碼只能放置於一個包中,每一個Go程 序都必須包含一個main包以及一個main()函數,main()函數作為整個程式的入口。我們的第一個Go程式原始碼中,第一行package main 表明當前源檔案屬於main包,import後面是匯入的包,只有需要用到的包才需要匯入,匯入的包沒有使用,則會導致編譯失敗。Go語言語句是使用分號進行分隔的,但是在一般情況下我們不用手動添加,編譯器會自動完成這些工作,除非需要在一行中寫多條語句。

Go語言的函數和方法都以關鍵字func 進行定義。以上代碼中的main函數的第一行使用了:=操作符,該標記法宣告並初始化了一個字串變數。Go語言雖然是一門靜態強型別的語言,但是在使用:=操作符時,Go語言會根據符號右邊的值推匯出符號左邊變數的類型。這兒的例子中,'World'是一個字串,所以Go語言將變數target建立為一個字串類型,並且進行賦值。

代碼中os.Args是一個字串切片(slice),切片內容是傳遞給Go程式的參數。切片是一個可以動態增長的數組,可以通過len()內建函數計算切片的長度,通過slice[n]的方式訪問切片中的第n個元素,而slice[n:]則返回從第n個元素到最後一個元素的切片,像極了Python中的切片。

3. 編譯運行

下面該對helloworld程式進行編譯運行了。隨著Go語言發布的Go命令列工具可以很方便的構建Go程式,包括編譯串連Go原始碼,管理Go 軟體包等。如果需要快速執行Go程式,使用以下命令:

$ go run hello.go

Hello World

go run hello.go命令直接讓Go源檔案運行,不會產生任何可執行檔,這可以快速查看原始碼的執行效果。一般情況下,我們將Go原始碼編譯連結成可執行檔,以方便隨時運行。可以使用以下命令進行:

$ go build hello.go

$ ./hello Aiden

Hello Aiden

以上的命令中,go build hello.go 編譯和連結hello.go代碼,並且產生了可執行檔hello。接著我們運行hello程式,並傳遞了一個參數給它,可以看到程式正常運行並且如期輸出了結果。

四. 樣本二 goroutine和channel

Go語言能之所以這麼流行,goroutine和channel是兩個很重要的因素,因為這兩者讓並發(並行)變的如此簡單,具體請看如下分組求和的例子。

1. 源碼

使用VIM編寫原始碼:

$ gvim sum_by_group.go

輸入以下原始碼:

package main

 

import "fmt"

 

func sum(a []int, result chan int) {

    sum := 0

    for _, v := range a {

        sum += v

    }

    result <- sum

}

 

func main() {

    a := []int{2, 3, 5, 6, 10, -5, 1, 0}

    result := make(chan int)

    go sum(a[:len(a)/2], result)

    go sum(a[len(a)/2:], result)

    x, y := <-result, <-result

 

    fmt.Println(x, y, x+y)

}

2. 說明

goroutine是Go語言並行設計的核心。goroutine是一種比線程更輕量的實現,十幾個goroutine可能在底層就是幾個線程。要使用goroutine只需要簡單的在需要執行的函數前添加go關鍵字即可。當執行goroutine時候,go語言立即返回,接著執行剩餘的代碼,goroutine不阻塞主線程。channel就像一個管道,但是可以雙向傳輸資料,通過它我們可以接收和發送資料,假如result 是一個channel那麼:result <- value 是將資料發送到result, 而key <- result就是從result中接收一個資料,就如以上的代碼所示,值得注意的地方是channel只能通過Go語言內建的函數make(chan type)建立,其中type指明了該channel能傳遞的資料類型。

下面我們來說說以上的代碼。在main函數中,我們聲明了一個int類型的切片a,然後通過內建函數make建立了一個能接收和發送int類型的channel。然後通過關鍵字go執行了兩個goroutine,這兩個goroutine的功能是分別計算切片a前半部分和後半部分的和。在這裡main函數碰到go關鍵字,派發goroutine執行相應的函數後,立即返回執行剩餘的代碼,不會等待goroutine的返回。sum函數中,計算切片的和,然後將結果發送到channel。接下來main函數,從channel中擷取結果,在這裡,main函數會阻塞至直到能從channel result中接收到資料,最後我們列印出了結果。

3. 運行

運行結果如下:

$ go run sum_by_group.go

16 6 22

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.