Go語言入門基礎教程--Let's go

Go語言從開源至今已經十餘年了,它擁有活躍的社區和一定的使用流行度(2019年底排名第14位).
今天我們將認識Go語言是什麼?探討Go能用來做什麼?還將使用Go語言的基礎語法進行實踐操作.

什麼是Go語言

Go 是一個開源的編程語言,它能讓構造簡單、可靠且高效的軟件變得容易。
Go 是一種靜態強類型、編譯型、併發型,並具有垃圾回收功能的編程語言。

Go適合做什麼

Go 語言被設計成一門應用於搭載 Web 服務器,存儲集羣或類似用途的巨型中央服務器的系統編程語言。
對於高性能分佈式系統領域而言,Go 語言無疑比大多數其它語言有着更高的開發效率。它提供了海量並行的支持,這對於遊戲服務端的開發而言是再好不過了。

Go 語言作爲服務器編程語言,很適合處理日誌、數據打包、虛擬機處理、文件系統、分佈式系統、數據庫代理等;網絡編程方面,Go語言廣泛應用於Web應用、API應用、下載應用等;除此之外,Go語言還可用於內存數據庫和雲平臺領域,目前國外很多雲平臺都是採用Go開發。

環境安裝

Go語言安裝包下載路徑: https://golang.google.cn/dl/

Linux安裝
1.下載go1.13.6.linux-amd64.tar.gz
2.將安裝包解壓到/usr/local:

sudo tar -C /usr/local -xzf go1.13.6.linux-amd64.tar.gz

3.添加PATH環境變量:

export PATH=$PATH:/usr/local/go/bin

注意:此方式添加的環境變量僅在當前命令窗口有效;如需配置全局環境變量,可在.bashrc添加(不推薦).

Windows安裝
1.下載go1.13.6.linux-amd64.msi
2.點擊安裝包進行安裝,默認會安裝在`C:\Go`目錄下,安裝後會自動添加環境變量到Path下;

注意:添加環境變量後你需要重啓命令窗口才會生效。

Hello World實例

先來看一下簡單的"Hello World"代碼(推薦使用VS Code編輯器進行編寫,這樣只需要安裝插件,減少軟件的安裝):

package main
import "fmt"
func main() {
   // 輸出Hello, World!
   fmt.Println("Hello, World!")
}

在命令窗口使用`go run`運行該文件,輸出如下:
print hello
還可以使用`go build`指令來生成二進制文件(Windows會生成.exe文件):

我們可以來解讀一下這個示例代碼:

第一行`package main`,定義包名。必須在源文件中非註釋的第一行指明這個文件屬於哪個包,每個 Go 應用程序都包含一個名爲 main 的包;
第二行`import "fmt"`,告訴 Go 編譯器這個程序需要使用 fmt 包(的函數,或其他元素);
第三行`func main()`,程序開始執行的函數,main 函數一般來說都是第一個執行的函數(如果有 init() 則會先執行該函數);
第四行`//`,單行註釋,多行註釋用`/**/`,與其他編程語言類型。
第五行`fmt.Print()`,將字符串輸出到控制檯。

可以看出,Go 語言的基礎組成有以下幾個部分:包聲明引入包函數變量語句 & 表達式註釋

特殊語法

Go語言中有幾處有別於其他編程語言的規定,並且是強制性的,不遵循的話會產生編譯錯誤:

  1. 每行程序結束後不需要撰寫分號`;`
  2. 大括號`{`不能單獨放在一行
  3. if判斷和for循環不需要以小括號包括起來

比如我們單獨另起一行放置`{`,進行編譯會出現如下報錯:

基礎語法

定義變量

Go 語言變量名由字母、數字、下劃線組成,其中首個字符不能爲數字。
聲明變量的一般形式是使用 var 關鍵字。

package main
import "fmt"
func main() {
   var a = "aaa"
   fmt.Println(a)
   b := "bbb"
   fmt.Println(b)
   var c, d int = 1, 2
   fmt.Println(c ,d)
}

輸出:

注意:省略 var進行變量定義時(首選:=賦值形式),`:= `左側如果沒有聲明新的變量,會產生編譯錯誤。

條件語句之select

select 是Go中的一個控制結構,類似於用於通信的switch。每個case必須是一個通信操作,要麼是發送要麼是接收。
select 隨機執行一個可運行的case。如果沒有case可運行,它將阻塞,直到有case可運行。默認子句應總是可運行的。

示例代碼:

package main
import "fmt"
func main() {
   var c1, c2, c3 chan int
   var i1, i2 int
   select {
      case i1 = <-c1:
         fmt.Printf("received ", i1, " from c1\n")
      case c2 <- i2:
         fmt.Printf("sent ", i2, " to c2\n")
      case i3, ok := (<-c3):  // same as: i3, ok := <-c3
         if ok {
            fmt.Printf("received ", i3, " from c3\n")
         } else {
            fmt.Printf("c3 is closed\n")
         }
      default:
         fmt.Printf("no communication\n")
   }    
}

輸出結果:

關於通道(channel)

上面 select 的示例代碼裏引出來Go語言中一個重要的部分——通道(channel)。
channel 是 goroutine 之間通信的一種方式,通過它,一個 goroutine (輕量級線程)可以向另一 goroutine 發送消息。

channel 使用內置的 make 函數創建,和其他引用類型一樣,channel 的空值爲 nil 。
操作符 <- 用於指定通道的方向,發送或接收。如果未指定方向,則爲雙向通道。
看一下 channel 的讀寫示例:

// create channel
ch := make(chan int)
// write to channel
ch <- x
// read from channel
x <- ch
// another way to read
x = <- ch

注意:channel 一定要初始化後才能進行讀寫操作,否則會永久阻塞。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章