Go 語言學習指南:變數、迴圈、函式、資料型別、Web 框架等全面解析

小萬哥丶發表於2023-12-24

學習基礎知識

掌握 Go 語言的常見概念,如變數、迴圈、條件語句、函式、資料型別等等。深入瞭解 Go 基礎知識的好起點是查閱 Go 官方文件

文章連結:Go 程式語言詳解:用途、特性、與 Python 和 C++ 的比較

基本語法

瞭解 Go 語言的基本語法,包括 Go 程式的執行方式、包引入、主函式等

Go 中的變數

變數是賦予記憶體位置的名稱,用於儲存特定型別的值。Go 語言提供了多種宣告和使用變數的方式。

文章連結:Go 語言變數型別和宣告詳解

資料型別

Go 是一種靜態型別的程式語言,這意味著每個變數在初始時都有一個定義的型別,並且只能儲存該型別的值。在 Go 中,有兩類資料型別:基本型別和複合型別。

文章連結:解析 Go 程式語言資料型別:bool、整數、浮點數和字串詳細介紹

For Loop

Go 語言只有一種迴圈結構,即 for 迴圈。基本的 for 迴圈由三個部分組成,用分號分隔:

  1. 初始化語句:在第一次迭代之前執行
  2. 條件表示式:在每次迭代之前評估
  3. 後置語句:在每次迭代結束時執行

文章連結:Go 語言中 For 迴圈:語法、使用方法和例項教程

Range

Range 與 For 迴圈一起用於在陣列、字串和其他資料結構中迭代每個元素。

條件語句

條件語句用於僅在某個條件為真時執行程式碼;Go 支援:

  • if 語句
  • if / else 語句
  • switch case 語句

文章連結:深入瞭解 Golang 條件語句:if、else、else if 和巢狀 if 的實用示例

Errors/Panic/Recover

為了替代新增異常處理程式,Go 的建立者利用了 Go 能夠返回多個值的能力。發出錯誤的 Go 語言中最常用的技術是將錯誤作為返回的最後一個值。

Panic 通常意味著發生了意外錯誤。主要用於在不應該在正常操作期間發生的錯誤或我們無法優雅處理的錯誤時快速失敗。

Go 中的 Panic 恢復取決於一種語言特性,稱為延遲函式。Go 具有在其父函式返回時保證函式執行的能力。這會發生無論父函式返回的原因是 return 語句、函式塊的結束還是 panic

Functions

瞭解 Go 中函式的工作原理,下面的資源列表將涵蓋:

  • 如何在 Go 中定義和呼叫函式?
  • Go 中的命名返回值?
  • 處理多個返回型別。
  • Go 中不同型別的函式。

文章連結:Go 語言函式、引數和返回值詳解

Packages

包是 Go 語言中最強大的部分。包的目的是透過將相關功能組合到單個單元中,從而設計和維護大量程式,以便它們易於維護和理解,並且獨立於其他包程式。這種模組化允許它們進行共享和重用。在 Go 語言中,每個包都用不同的名稱定義,並且該名稱與其功能密切相關,如“strings”包,它包含與字串相關的方法和函式。

文章連結:Go 語言基礎:包、函式、語句和註釋解析

Type Casting

Go 不支援自動型別轉換,但允許型別轉換,即顯式更改變數型別。要了解更多關於型別轉換的資訊,請訪問以下資源:

Type Inference

型別推斷使 Go 能夠檢測值的型別,而無需明確指定型別,因此可以在首次宣告變數時宣告變數而不提供其型別的可能性。

Arrays

在 Go 中,陣列是在建立陣列時定義的具有相同型別的元素集合。

文章連結:Go 語言陣列基礎教程 - 陣列的宣告、初始化和使用方法

Slices

切片類似於陣列,但更強大和靈活。像陣列一樣,切片也用於在單個變數中儲存相同型別的多個值。但與陣列不同,切片的長度可以根據需要增長和縮小。

文章連結:Go 語言中切片的使用和理解

Maps

對映是 Go 中的資料結構,我們在想要在鍵值對之間進行對映時使用它。它們在刪除或新增元素方面具有靈活性。對映不允許重複條目,同時資料是無序的。

文章連結:Go 語言之 Maps 詳解:建立、遍歷、操作和注意事項

Make

Golang 的內建函式 make 幫助我們建立和初始化切片、對映和通道,具體取決於傳遞給函式的引數。

Structs

結構是使用者定義的型別,幫助我們建立描述單個實體的資料集合

文章連結:Go 語言中結構體的使用和示例

Modules

Go 模組是一組相關的包,它們被一起進行版本控制和分發。它們指定了我們專案的要求,列出了所有所需的依賴項,並幫助我們跟蹤安裝的依賴項的具體版本。

Working with JSON

JSON(JavaScript 物件表示法)是一種簡單的資料交換格式。在語法上,它類似於 JavaScript 的物件和列表。它最常用於 Web 後端與在瀏覽器中執行的 JavaScript 程式之間的通訊,但它在許多其他地方也被使用。

Types and Type Assertions

Golang 中的型別斷言提供了對介面變數的確切型別的訪問。

Interfaces

Go 中的介面是一種定義一組方法的型別。如果我們有一個實現該方法集的型別(例如結構體),那麼我們就有了實現該介面的型別。

Context

context 包提供瞭解決請求期間管理狀態問題的標準方式。該包滿足對請求範圍資料的需求,並提供了處理截止日期、取消訊號等的標準化方式。

Goroutines

Goroutines 允許我們在 Go 中編寫併發程式。處理成千上萬個請求的 Web 伺服器或在同時進行網路請求的同時呈現新頁面的網站都是併發的示例。在 Go 中,每個併發任務都稱為 Goroutines
具和協議。它們幫助您在開發Web應用程式時繞過一些操作,而不是每次都重新發明輪子。使用API客戶端是加快開發過程的好方法

REST

REST(表述性狀態轉移)API(應用程式程式設計介面)

Channels

通道是連線併發Goroutines的管道。您可以從一個Goroutine向通道傳送值,然後從另一個Goroutine接收這些值。通道是一種透過通道運算子<-傳送和接收值的有型別導管。

Buffer

緩衝區屬於Go語言的位元組包,我們可以使用這些包來操作字串的位元組。

Select

select 語句讓一個Goroutine等待多個通訊操作。select 語句阻塞,直到其一個case可以執行,然後執行該case。如果有多個case準備就緒,則它會隨機選擇一個。select 語句類似於switch語句,但在select語句中,case語句涉及通訊,即在通道上傳送或接收操作。

Mutex

Go允許我們使用Goroutines併發執行程式碼。然而,當併發程式訪問相同的資料片段時,可能導致競態條件。Mutexsync包提供的資料結構。它們可以幫助我們在資料的不同部分放置鎖,以便一次只能有一個Goroutine訪問它。

Building CLI Applications

與圖形使用者介面(GUI)不同,命令列介面(CLI)僅限於文字。雲和基礎架構應用程式主要基於CLI,因為它們易於自動化並具有遠端功能。Go應用程式構建為單一自包含二進位制檔案,使得安裝Go應用程式變得簡單;具體來說,用Go編寫的程式可以在任何系統上執行,而無需任何現有庫、執行時或依賴項。而且,使用Go編寫的程式具有即時啟動時間,類似於C或C++,但其他程式語言無法達到。

Cobra

Cobra 是用於建立強大的現代CLI應用程式的庫。

Urfave CLI

Urfave cli 是用於在Go中構建命令列應用程式的簡單、快速且有趣的包。

ORMs

物件關係對映(ORM)是電腦科學中一種使用物件導向程式語言在型別系統之間轉換資料的程式設計技術。實際上,這建立了一個“虛擬物件資料庫”,因此是一種抽象層,可以從程式語言內部使用。

Gorm

GORM 是針對Golang的出色ORM庫,旨在使開發人員友好。它是用於處理關聯式資料庫的ORM庫。此gorm庫是在database/sql包的基礎上開發的。ORM的概述和功能包括:全功能的ORM(幾乎)

Web框架

Go語言有幾個著名的Web框架,其中最常見的包括:

Beego

Beego 用於在Go中快速開發企業應用,包括RESTful API、Web應用和後端服務。它受到了Tornado、Sinatra和Flask的啟發。beego 具有一些Go特定的功能,如介面和結構巢狀。

Gin

Gin 是一個用Go編寫的高效能HTTP Web框架。Gin 具有類似Martini的API,並聲稱速度最高可達40倍。Gin 允許您在Go中構建Web應用程式和微服務。

Web Frameworks

Revel

Revel 將端點組織到控制器中。它提供簡單的資料繫結和表單驗證。Revel 使得在規模上使用Go模板變得簡單。可以在操作之前或之後註冊功能。

Echo

Echo 是一個專注於效能的、可擴充套件的、開源的Go Web應用框架。它是一個介於stdlib +路由器和全棧Web框架之間的極簡主義Web框架。

Gorilla

Gorilla 是用於Go程式語言的Web工具包,提供有用的、可組合的包,用於編寫基於HTTP的應用程式。

Go Fiber

Go Fiber 是受Express啟發的Golang框架。Go Fiber 是建立在快速HTTP之上的Web框架。它可以用於處理路由/端點、中介軟體、伺服器請求等操作。

Buffalo

Buffalo 幫助您生成一個Web專案,該專案已經連線並準備好執行,從前端(JavaScript、SCSS等)到後端(資料庫、路由等)都已經連線。從那裡,它提供了一種在Go中快速構建Web應用程式的簡單API。

Logging

Go具有內建功能,使程式設計師更容易實現日誌記錄。第三方也構建了額外的工具,以使日誌記錄更加容易。

Apex

用於Go的結構化日誌記錄包。

Zerolog

zerolog 包提供了一個專注於JSON輸出的快速且簡單的記錄器。Zerolog 的API旨在既提供出色的開發人員體驗,又具有驚人的效能。其獨特的連結API允許zerolog 透過避免分配和反射來寫入JSON(或CBOR)日誌事件。

Zap

在Go中進行快速、結構化、級別日誌記錄。

Real-time Communication

Melody

Melody 是基於github.com/gorilla/websocket的websocket框架,它抽象出了處理websocket

的繁瑣部分,讓您可以編寫實時應用程式。

Centrifugo

Centrifugo 是一個開源的可擴充套件實時訊息伺服器。Centrifugo 可以立即將訊息傳遞給透過支援的傳輸連線的應用程式線上使用者(WebSocket、HTTP流、SSE/EventSource、GRPC、SockJS、WebTransport)。Centrifugo 有通道的概念,因此它是一個面向使用者的釋出/訂閱伺服器。

API Clients

API客戶端是一組從計算機上的應用程式操作的工)用於處理網站時傳遞使用者功能。使用HTTP請求與REST API進行通訊,以便使用者可以導航到URL網站。這些URL可以返回儲存為API的一部分的特定資訊。

Heimdall

Heimdall 是一個HTTP客戶端,可以幫助您的應用程式大規模進行請求。使用Heimdall,您可以:

  • 使用類似Hystrix的斷路器來控制失敗的請求
  • 為每個請求新增同步記憶體重試,可選擇設定自己的重試策略
  • 為每個請求建立具有不同超時的客戶端
  • 所有HTTP方法都以流暢的介面形式公開。

Grequests

Grequests 是Python Grequests庫的Golang實現。功能包括:

  • 響應可以序列化為JSON和XML
  • 輕鬆上傳檔案
  • 輕鬆下載檔案
  • 支援以下HTTP動詞GET、HEAD、POST、PUT、DELETE、PATCH、OPTIONS

GraphQL

GraphQL 是用於API的查詢語言,它提供了一個服務,優先考慮僅提供客戶端請求的資料而不是更多資料。此外,您無需擔心破壞更改、版本控制和向後相容性等問題,就像REST API一樣。因此,您可以透過使用GraphQL來實現您的版本並自動記錄API。

GraphQL Go

Go的GraphQL包

GraphQL

Gqlgen

根據它們的文件,這是一個在不費力氣的情況下構建GraphQL伺服器的Golang庫。

Testing Go Code

Go具有內建的測試命令,我們可以使用它來測試我們的程式。

Microservices

微服務是一種軟體開發的架構方法,它允許從可部署服務中建立分散式應用程式,這些服務透過明確定義的API進行通訊。它是對單體的解決方案。

Watermill

Watermill 是用於處理Go中的非同步請求的事件流庫。它提供多組實現用於釋出/訂閱。例如:您可以使用傳統的釋出/訂閱實現,如Kafka或RabbitMQ,也可以使用HTTP或MySQL binlog,如果適合您的用例。

Rpcx

Rpcx 是類似於阿里巴巴Dubbo和微博Motan的RPC(遠端過程呼叫)框架。使用Rpcx 的一些優勢:

  • 簡單:易於學習、易於開發、易於整合和易於部署
  • 效能:高效能(>= grpc-go)
  • 跨平臺:支援原始位元組切片、JSON、Protobuf和MessagePack。理論上它可以與java、php、python、c/c++、node.js、c#和其他平臺一起使用
  • 服務發現和服務治理:支援zookeeper、etcd和consul。

Go kit

Go kit 是用於在Go中構建微服務(或優雅的單體)的程式設計工具包。它解決了分散式系統和應用架構中的常見問題,因此您可以專注於提供業務價值。

Micro

這是一個以API為先的開發平臺。它利用微服務架構模式,並提供了一組服務,它們充當平臺的構建塊。

go-zero

go-zero 是一個內建了許多工程最佳實踐的Web和RPC框架。它誕生於保證繁忙服務的穩定性,並且多年來一直為擁有數千萬使用者的站點提供服務。

Protocol Buffers

協議緩衝區(Protobuf)是一種免費、開源、語言中立、平臺中立、可擴充套件的資料格式,用於序列化結構化資料。它類似於JSON,但更小、更快,並生成本地語言繫結。

使用協議緩衝區的一些優勢包括:

  • 緊湊的資料儲存
  • 快速解析
  • 在許多程式語言中可用
  • 透過自動生成的類進行最佳化功能

gRPC Go

gRPC(gRPC Remote Procedure Call)的Go語言實現。

Grpc gateway

gRPC-Gateway 在gRPC服務之上建立了一層,它將充當客戶端的RESTful服務。它是protoc的外掛。它讀取gRPC服務定義,並生成一個將RESTful JSON API轉換為gRPC的反向代理伺服器。

Twirp

Twirp 是強調簡單和極簡的服務之間通訊的框架。它從API定義檔案生成路由和序列化,讓您專注於應用程式的邏輯,而不是考慮HTTP方法和路徑以及JSON之類的瑣事。

最後

為了方便其他裝置和平臺的小夥伴觀看往期文章:

微信公眾號搜尋:Let us Coding,關注後即可獲取最新文章推送

看完如果覺得有幫助,歡迎 點贊、收藏、關注

相關文章