Go語言程序設計

Go語言概述

語言歷史

Go語言也稱爲Golang,是由Google公司開發的一種靜態強類型、編譯型、語言原生支持併發、具備垃圾回收功能的編程語言。起源於2007年,並在2009年正式對外發布。Go語言是很是年輕的一門語言,它的主要目標是「兼具 Python 等動態語言的開發速度和 C/C++等編譯型語言的性能與安全性」。linux

Go語言是編程語言設計的又一次嘗試,是對類C語言的重大改進,它不但能讓你訪問底層操做系統,還提供了強大的網絡編程和併發編程支持。Go語言的用途衆多,能夠進行網絡編程、系統編程、併發編程等等。git

Go語言的推出,旨在不損失應用程序性能的狀況降低低代碼的複雜性,具備「部署簡單、併發性好、語言設計良好、執行性能好」等優點。golang

Go語言有時候被描述爲「21世紀的C語言」。Go 從C語言繼承了類似的表達式語法、控制流結構、基礎數據類型、調用參數傳值、指針等不少思想,還有C語言編譯後的運行效率。docker

Go語言沒有類和繼承的概念,經過組合來實現代碼複用,同時它經過接口(interface)的概念來實現多態性。因此Go語言的面向對象編程和傳統面嚮對象語言(如C++和Java)並不相同。數據庫

Go語言有一個吉祥物,在會議、文檔頁面和博文中,大多會包含下圖所示的 Go Gopher,這是才華橫溢的插畫家 Renee French 設計的,她也是 Go 設計者之一 Rob Pike 的妻子。編程

img

語言特性

語法簡單windows

Go語言的設計思想相似Unix的「少便是多」。Go語言的語法規則嚴謹,沒有歧義,這使得Go語言簡單易學。Go語言保留了指針,但一般狀況下禁止指針運算(保留unsafe包操做指針的能力)。此外,Go語言還內置切片和字典,在保留運行性能的同時也提升了開發效率。瀏覽器

語言級別支持併發安全

主流的併發模型有多進程模型、多線程模型。和主流多併發模型不一樣,Go語言採用了基於CSP的協程實現,而且在運行時作了更深度的優化處理。這使得語言級別上併發編程變得極爲容易,無須處理回調、也無需關注線程切換,只須要添加一個go關鍵字便可。bash

「經過通訊去共享內存,而不是經過共享內存去通訊」,go語言內置的channel數據結構配合go關鍵字實現併發通訊及控制,這對於須要考慮內存可見性等問題的多線程模型來講,是一個良好的解決方案。

高效的垃圾回收

Go語言的每次升級,垃圾回收器必然是核心組件裏修改最多的部分。從併發清理,到下降STW時間,直到Go的1.5版本實現併發標記,逐步引入三色標記和寫屏障等等,都是爲了能讓垃圾回收在不影響用戶邏輯的狀況下更好地工做。從最開始的秒級別STW到目前的微秒級STW,Go語言開發團隊一直在垃圾回收方面進行努力。

靜態連接

靜態編譯的好處顯而易見。將運行時、依賴庫直接打包到可執行文件內部,簡化了部署和發佈操做,無須事先安裝運行環境和下載諸多第三方庫。雖然相比動態編譯增長了可執行文件的大小,可是省去了依賴庫的管理。隨着微服務和容器化的發展,這也成爲了Go語言的殺手鐗之一,一個二進制文件便可運行服務。

標準庫

功能完善、質量可靠的標準庫爲編程語言提供了有力的支持。在不借助第三方擴展的狀況下,就可完成大部分基礎功能開發,這大大下降了學習和使用成本。

Go語言標準庫能夠說極爲豐富。其中值得稱道的是net/http,僅須簡單幾條語句就能實現一個高性能 Web Server。

工具鏈

完整的工具鏈對於項目開發極爲重要。Go語言在此作得至關不錯,不管是編譯、格式化、錯誤檢查、幫助文檔,仍是第三方包下載、更新都有對應的工具。

值得一提的gofmt工具,爲了解決開發者常常遇到的「代碼風格不統一」的難題,官方直接經過gofmt指定一套標準,能夠看出go語言在工程方面確實解決了許多實際問題。

此外Go語言內置完整測試框架,其中包括單元測試、性能測試、代碼覆蓋率、數據競爭,以及用來調優的pprof,這些都是保障代碼能正確而穩定運行的必備利器。

Go語言應用場景

Go 語言從發佈1.0版本以來備受衆多開發者關注並獲得普遍使用,Go 語言的簡單、高效、併發特性吸引了衆多傳統語言開發者的加入,並且人數愈來愈多。

鑑於Go語言的特色和設計的初衷,Go語言做爲服務器編程語言,很適合處理日誌、數據打包、虛擬機處理、文件系統、分佈式系統、數據庫代理等;網絡編程方面,Go語言普遍應用於Web應用、API應用、下載應用等;除此以外,Go語言還適用於內存數據庫和雲平臺領域,目前國外不少雲平臺都是採用Go開發。

  • 服務器編程。例如處理日誌、數據打包、虛擬機處理、文件系統等。
  • 分佈式系統、數據庫代理器、中間件等。例如Etcd。
  • 網絡編程。這一塊目前應用最廣,包括Web應用、API應用、下載應用等等。
  • 開發雲平臺。目前國內外不少雲平臺在採用Go開發。

Go語言知名項目

Go發佈以後,不少公司特別是雲計算公司開始用Go重構他們的基礎架構,不少基礎設施都是直接採用Go進行了開發,誕生了許多熱門項目。

基礎設施

表明項目:docker、kubernetes、etcd、consul等。

數據庫

表明項目:influxdb、cockroachdb等。

微服務

表明項目:go-kit、micro、kratos等。

安裝Go語言

Go語言可用於FreeBSD、Linux、Windows和macOS等操做系統。有關對這些平臺的要求,請參與Go語言網站列出的系統需求。

Go語言的官方網站爲https://golang.org/,國內的用戶能夠訪問https://golang.google.cn/dl/。一般狀況下,按照本文的步驟進行安裝不會出現問題,遇到安裝問題的讀者,請經過公衆號與我聯繫。

Windows系統

下載連接

默認安裝到C:go目錄下,建議不要更改安裝目錄。

GOPATH配置

安裝完畢後須要配置GOPATH,GOPATH是Go語言用來存放第三方源碼、二進制文件、類庫等文件的路徑。

  1. 例如系統用戶名爲demo,則須要新建如下三個目錄:
  • C:Usersdemogosrc 存放源碼
  • C:Usersdemogopkg 存放類庫
  • C:Usersdemogobin 存在二進制文件
  1. 環境變量設置:
  • 新增GOPATH,值爲C:Usersdemogo
  • 新增PATH(已存在則編輯),值爲C:Usersdemogobin

Linux系統

Linux具備衆多發行版,如Ubuntu、CentOS、RedHat、Debian等等,全部發行版的安裝步驟是一致的,區別是根據CPU架構選擇不一樣的發佈包。

常見的我的計算機CPU架構爲amd64,下載amd64架構的發佈包便可。

Linux配置命令

下載壓縮包

wget https://golang.google.cn/dl/go1.15.8.linux-amd64.tar.gz

移動到opt目錄

mv go1.15.8.linux-amd64.tar.gz /opt

解壓

tar xf go1.15.8.linux-amd64.tar.gz

新建GOPATH目錄

cd ~

mkdir go

cd go

mkdir pkg src bin

編輯 ~/.bashrc文件, 添加bin路徑到PATH環境變量中

echo 'GOPATH=用戶主目錄/go' >> ~/.bashrc

echo 'PATH=/opt/go/bin:$GOPATH/bin:$PATH' >> ~/.bashrc

更新環境變量

source ~/.bashrc

測試安裝結果

go version

macOS系統

Apple公司於2020年發佈了採用M1芯片(arm64架構)的硬件產品,支持M1芯片的Go語言版本爲1.16,根據CPU架構選擇對應的pkg包安裝便可。

macOS配置命令

新建GOPATH目錄

cd ~

mkdir go

cd go

mkdir pkg src bin

編輯 ~/.bashrc文件, 添加bin路徑到PATH環境變量中

echo 'GOPATH=用戶主目錄/go' >> ~/.bashrc

echo 'PATH=$GOPATH/bin:$PATH' >> ~/.bashrc

更新環境變量

source ~/.bashrc

測試安裝結果

go version

配置集成開發環境

本節將介紹如何在本地計算機上配置集成開發環境,如下步驟使用macOS版本做爲示例,其餘操做系統相似。

Visual Studio Code(簡稱VSCode)是由微軟開發的、同時支持Windows、Linux和macOS操做系統的開源編輯器,它支持測試,而且內置了git功能,提供了豐富的語言支持與經常使用編程工具。

  1. 打開官方網站 https://code.visualstudio.com/,點擊藍色按鈕下載便可。
  2. 新版本的VSCode再也不內置中文語言包,須要安裝語言包擴展。安裝VSCode後打開VSCode編輯器,在擴展窗口中搜索「Chinese」,安裝第一個便可。

image-20191022102923920

  1. 用VSCode新建一個空項目,打開項目以後新建main.go,此時VSCode右下角會彈出Go工具鏈安裝的提示,選擇」Install All「便可。

編寫HTTP服務器

代碼

package main
​
import (
 "io"
 "net/http"
)
​
func main() {
 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
 io.WriteString(w, "hello world")
 })
 http.ListenAndServe(":8080", nil)
}

程序結構說明

  • package 關鍵字聲明文件所在的包,每一個go文件都必須聲明。每一個可執行程序都必須包含main包,程序的入口點爲main包的func main函數
  • import 關鍵字聲明須要導入的包,代碼中須要使用http服務器相關方法,所以導入了http包
  • func main程序的入口點

編譯並運行程序

編譯並運行文件是開發過程當中的一個常見步驟,Go提供了完成這個步驟的快捷途徑。

Go語言提供了build和run兩個命令來編譯運行Go程序:

  • go build 會編譯可執行文件,並不執行
  • go run 不會建立可執行文件,直接執行

使用go run運行HTTP服務器,以後經過瀏覽器打開便可。

小結

本文介紹了Go語言的安裝以及集成開發環境的配置。經過HTTP服務器演示了Go程序的開發過程。

下一章將學習Go語言的基本語法:

  • 變量和常量
  • 數據類型
  • 運算符
  • 條件語句
  • 循環語句

0.jpeg

相關文章
相關標籤/搜索