Go語言基礎基礎

簡介

Go語言(也稱為Golang)是一種靜態類型、編譯型語言,由Google的Robert Griesemer、Rob Pike和Ken Thompson于2007年設計,首次公開發布于2009年。Go的設計初衷是解決當時谷歌內部面臨的軟件開發問題,特別是在處理大型服務器軟件時的效率、并發和可靠性方面。Go語言結合了解釋型語言的開發速度和編譯型語言的性能,以及靜態類型語言的安全性。它特別注重簡潔、高效和易于理解的語法設計,旨在提高開發者的生產力。

主要特性

  • 靜態類型和安全:Go是靜態類型的語言,這意味著變量的類型在編譯時就確定了,這有助于提前發現錯誤。
  • 并發模型:Go語言的并發模型是它的一大特色,通過goroutines(輕量級線程)和channels(用于goroutines間的通信)來實現并發編程,使并發更加容易理解和使用。
  • 標準庫:Go擁有一個豐富的標準庫,覆蓋了網絡、加密、數據處理等多個領域,這些庫的設計和實現都非常注重性能和安全性。
  • 工具鏈:Go語言自帶的工具鏈提供了編譯、格式化代碼、文檔查看、性能分析等功能,這些工具的集成度很高,使得Go項目的構建和維護變得簡單高效。
  • 跨平臺編譯:Go支持跨平臺編譯,開發者可以輕松地為不同的操作系統和架構編譯程序。

使用場景

Go語言因其簡潔、高效和強大的并發支持而廣受歡迎,特別適合以下場景:

  • 云計算和微服務:Go語言在構建高性能、高并發的網絡服務器和微服務方面表現出色。
  • 命令行工具:Go的編譯型特性和豐富的標準庫使其成為開發高效命令行工具的理想選擇。
  • 分布式系統和網絡服務:Go的并發模型和網絡庫使其非常適合開發分布式系統和網絡服務。
  • 容器和基礎設施工具:Go是Docker和Kubernetes等流行的容器和基礎設施工具的開發語言,這些工具的成功也反過來推動了Go的普及。

Go語言基礎

變量與類型

在Go中,變量是存儲數據的容器,而類型是這些數據的藍圖,告訴Go如何處理這些數據。

變量聲明

Go提供了多種聲明變量的方式,最直接的方式是使用var關鍵字:

var name string = "Go語言"

但Go也支持類型推斷,允許你在不顯式聲明類型的情況下初始化變量:

var name = "Go語言"

或者,使用短變量聲明,這是在函數內部聲明局部變量最常用的方式:

name := "Go語言"

數據類型

Go語言內置了多種數據類型,包括:

  • 基本類型intfloat64boolstring等。
  • 復合類型:如數組([3]int)、切片([]int)、映射(map[string]int)和結構體(struct)。
type Person struct {Name stringAge  int
}

函數

函數是執行特定任務的代碼塊。在Go中,通過func關鍵字來定義函數:

func greet(name string) string {return "Hello, " + name
}

Go支持多返回值,這在錯誤處理中尤其有用:

func divide(a, b float64) (float64, error) {if b == 0.0 {return 0.0, errors.New("division by zero")}return a / b, nil
}

控制結構

控制結構指導程序何時和如何執行代碼塊。Go支持的控制結構包括ifforswitch

If 語句

if語句用于基于條件的執行:

if num := 9; num < 0 {fmt.Println(num, "is negative")
} else {fmt.Println(num, "is non-negative")
}

For 循環

for循環是Go中唯一的循環結構,非常靈活:

for i := 0; i < 10; i++ {fmt.Println(i)
}

Switch 語句

switch語句用于替代多個if-else塊:

switch os := runtime.GOOS; os {
case "darwin":fmt.Println("OS X.")
case "linux":fmt.Println("Linux.")
default:fmt.Println("Other.")
}

數組(Array)

數組是具有固定大小的元素集合。在Go中,數組的長度被視為類型的一部分,這意味著不同長度的數組是不同的類型。

var a [5]int // 聲明一個含有5個整數的數組,默認值為0
b := [3]string{"Go", "Python", "Java"} // 使用數組字面量初始化

數組在Go中使用較少,主要是因為其固定長度的限制。然而,它們在性能敏感的應用中仍然有其價值。

切片(Slice)

切片是Go中最重要的數據類型之一,提供了比數組更強大的序列接口。切片是對數組的封裝,支持動態擴展。

s := []int{1, 2, 3} // 使用切片字面量初始化,底層是數組
s = append(s, 4, 5) // 切片可以動態增長

切片的動態擴展特性,加上它對子序列的高效操作能力,使其成為處理序列數據的首選。

映射(Map)

映射是鍵值對的集合,也稱為字典或散列表。在Go中,映射的鍵可以是任何可比較的類型,如整數、字符串。

m := make(map[string]int) // 使用make創建一個映射
m["Go"] = 1
m["Python"] = 2

映射的動態性使其非常適合于需要快速查找操作的場景。

結構體(Struct)

結構體是一種聚合數據類型,允許你將多個不同類型的項組合在一起。

type Person struct {Name stringAge  int
}p := Person{Name: "Alice", Age: 30} // 初始化結構體

結構體是Go中實現面向對象編程概念的基礎,如封裝(通過導出和未導出字段)和繼承(通過嵌入結構體)。

使用場景

  • 數組:當你需要一個固定長度的集合時使用。
  • 切片:用于需要動態大小的序列,或需要頻繁地增加、刪除元素。
  • 映射:適用于需要快速鍵值對查找的場景。
  • 結構體:用于模擬現實世界中的對象或復雜的數據實體。

方法、接口和錯誤處理

方法(Methods)

方法是附加到特定類型上的函數。通過方法,Go允許你在類型定義上增加行為。方法的聲明與函數類似,但在函數名之前增加了一個額外的參數,稱為接收者(receiver),它指定該方法附加到的類型。

基本語法

type MyType struct {value int
}func (m MyType) GetValue() int {return m.value
}

在這個例子中,GetValueMyType類型的一個方法,它返回類型實例的value字段。

指針接收者 vs 值接收者

方法可以通過值接收者或指針接收者來聲明。使用值接收者定義的方法在調用時使用值的副本,而指針接收者允許直接修改接收者指向的值。

func (m *MyType) SetValue(val int) {m.value = val
}

使用指針接收者的SetValue方法可以修改MyType實例的狀態。

接口(Interfaces)

接口定義了一組方法簽名的集合,任何類型只要實現了這些方法,就被認為實現了該接口。Go語言的接口實現是隱式的,不需要顯式聲明實現了哪個接口。

定義和實現

type Shape interface {Area() float64
}type Circle struct {radius float64
}func (c Circle) Area() float64 {return math.Pi * c.radius * c.radius
}

Circle通過實現Area方法隱式地滿足了Shape接口。

錯誤處理(Error Handling)

在Go中,錯誤被視為常規值,使用error類型來表示。這種設計鼓勵顯式的錯誤檢查,使錯誤處理更加清晰。

error接口

error是一個內置接口,定義如下:

type error interface {Error() string
}

創建和處理錯誤

func DoSomething() (int, error) {// 一個假設的錯誤場景return 0, errors.New("an error occurred")
}result, err := DoSomething()
if err != nil {// 錯誤處理log.Fatal(err)
}

在這個例子中,如果DoSomething函數遇到錯誤,它會返回一個錯誤值。調用者檢查返回的錯誤值,根據錯誤值進行相應的處理。

總結

通過深入了解方法、接口和錯誤處理,你可以更加充分地利用Go語言的特性,編寫出既靈活又健壯的應用程序。Go通過這些強大的特性,提供了一種清晰、簡潔的方式來表達程序邏輯,使得代碼易于理解和維護。

包管理

Go語言的包(package)系統不僅是代碼組織的基礎,也是Go生態系統中最強大的特性之一。正確地理解和使用包可以幫助你構建模塊化、可維護和可復用的代碼。本文將探討Go中的包管理,包括如何組織代碼、創建自定義包、使用第三方包,以及Go模塊的使用。

組織代碼

在Go中,每個包都是一個獨立的命名空間,包含一組相關的Go源文件。一個好的實踐是將功能相似或相關的代碼放在同一個包中。

  • 一個目錄一個包:Go語言的約定是一個目錄下的所有Go文件都屬于同一個包。包名通常是目錄名,但也可以自定義。
  • 簡潔的包名:選擇簡短、描述性的包名,避免使用通用詞匯如util,這有助于代碼的可讀性。

創建和使用自定義包

創建自定義包只需要在你的Go項目中創建一個新的目錄,并在該目錄下添加Go文件。在文件的頂部,使用package關鍵字聲明包名。

// 在 mypackage/mypackage.go
package mypackagefunc MyFunction() {// 函數實現
}

要使用這個包,只需在其他Go文件中使用import關鍵字導入它的路徑。在Go模塊中,這個路徑是從模塊根開始的完整路徑

import "myproject/mypackage"func main() {mypackage.MyFunction()
}

使用第三方包

Go社區提供了大量的開源包,你可以通過go get命令輕松地添加這些包到你的項目中。

go get github.com/gin-gonic/gin

這將下載指定的包并將其添加到你的go.mod文件中,這樣你就可以在項目中導入和使用這個包了。

Go模塊

Go模塊(Go Modules)是Go語言官方推薦的版本控制和包依賴管理解決方案。自Go 1.11版本以來,Go模塊提供了一種在項目中管理依賴的機制。

  • 初始化模塊:在項目根目錄下運行go mod init <module name>,這將創建一個go.mod文件。
  • 管理依賴:當你使用go get添加依賴或構建項目時,Go會自動更新go.modgo.sum文件,記錄項目的依賴。

小結

Go的包管理系統是其語言設計中的一個亮點,它鼓勵開發者采用模塊化和可重用的方式來組織代碼。通過理解和運用Go的包和模塊系統,你可以提高項目的結構清晰度和維護性。Go模塊進一步簡化了包的版本控制和依賴管理,使得處理大型項目和團隊協作變得更加容易。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718226.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718226.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718226.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

百度文庫旋轉驗證碼識別

最近研究了一下圖像識別&#xff0c;一直找到很好的應用場景&#xff0c;今天我就發現可以用百度的旋轉驗證碼來做一個實驗。沒想到效果還挺好&#xff0c;下面就是實際的識別效果。 1、效果演示 2、如何識別 2.1準備數據集 首先需要使用爬蟲&#xff0c;對驗證碼圖片進行采…

區塊鏈媒體發布推廣10個熱門案例解析-華媒舍

區塊鏈技術的發展已經引起了媒體的廣泛關注&#xff0c;越來越多的區塊鏈媒體紛紛發布推廣相關的熱門案例。本文將介紹10個成功的區塊鏈媒體推廣案例&#xff0c;并分享它們的成功秘訣&#xff0c;幫助讀者更好地了解區塊鏈媒體推廣的方法與技巧。 隨著區塊鏈技術的成熟和應用場…

第二證券:富時羅素擴容 A股引入國際增量資金

日前&#xff0c;英國富時羅素指數公司&#xff08;FTSE Russell&#xff0c;簡稱“富時羅素”&#xff09;公布的全球股票指數&#xff08;FTSE Global Equity Index Series&#xff09;半年度指數檢查陳述顯現&#xff0c;將新調入A股76只、調出1只。此前&#xff0c;富時羅素…

Leetcode 3049. Earliest Second to Mark Indices II

Leetcode 3049. Earliest Second to Mark Indices II 1. 解題思路2. 代碼實現3. 算法優化 題目鏈接&#xff1a;3049. Earliest Second to Mark Indices II 1. 解題思路 這道題我看貌似難度報表&#xff0c;比賽的時候貌似只有36個人搞定了這道題目&#xff0c;然后最快的人…

【LeetCode】升級打怪之路 Day 12:單調隊列

今日題目&#xff1a; 239. 滑動窗口最大值 | LeetCode 今天學習了單調隊列這種特殊的數據結構&#xff0c;思路很新穎&#xff0c;值得學習。 Problem&#xff1a;單調隊列 【必會】 與單調棧類似&#xff0c;單調隊列也是一種特殊的數據結構&#xff0c;它相比與普通的 que…

Get Your Back Covered! Coverage, CodeCov和Tox

1. Coverage - 衡量測試的覆蓋率 我們已經掌握了如何進行單元測試。接下來,一個很自然的問題浮現出來,我們如何知道單元測試的質量呢?這就提出了測試覆蓋率的概念。覆蓋率測量通常用于衡量測試的有效性。它可以顯示您的代碼的哪些部分已被測試過,哪些沒有。 coverage.py …

Arm平臺下各種memcpy優化對比<二>

因memcpy導致tda4vm上的h264解碼占CPU較高而改棄&#xff0c;從網上找到各種memcpy的優化代碼&#xff0c;在一起做了個運行速度對比&#xff0c;請查收&#xff1b; #include <stdio.h> #include <stdlib.h> /* rand, srand */ #include <string.h> #i…

智慧公廁:打造智慧城市的環衛明珠

在城市建設中&#xff0c;公共衛生設施的完善和智能化一直是重要環節。而智慧公廁作為智慧城市建設的重要組成部分&#xff0c;發揮著不可替代的作用。本文以智慧公廁源頭實力廠家廣州中期科技有限公司&#xff0c;大量精品案例現場實景實圖&#xff0c;解讀智慧公廁如何助力打…

【數據結構】B樹

1 B樹介紹 B樹&#xff08;英語&#xff1a;B-tree&#xff09;&#xff0c;是一種在計算機科學自平衡的樹&#xff0c;能夠保持數據有序。這種數據結構能夠讓查找數據、順序訪問、插入數據及刪除的動作&#xff0c;都在對數時間內完成。B樹&#xff0c;概括來說是一個一般化的…

MySQL高可用性攻略:快速搭建MySQL主從復制集群 !

MySQL高可用性攻略&#xff1a;快速搭建MySQL主從復制集群 &#xff01; MySQL基礎知識&#xff1a;介紹MySQL數據庫的基本概念和常用命令&#xff0c;如何創建數據庫、表、用戶和權限管理等。 MySQL安裝教程&#xff1a;Centos7 安裝MySQL5.7.29詳細安裝手冊 MySQL數據類型&…

【大廠AI課學習筆記NO.63】模型的維護

說是模型的維護&#xff0c;其實這堂課都是在講“在工業環境中開發和部署機器學習模型的流程”。 上圖來自于我的筆記思維腦圖&#xff0c;已經上傳&#xff0c;要鏈接的訪問的主頁查看資源。 一路走來&#xff0c;我們學習了數據管理、模型學習、模型驗證、模型部署等重要的步…

arm板運行程序時尋找動態庫的路徑設置

問題&#xff1a;error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file&#xff1f; 第一種方法---- 解決&#xff1a; ①復制需要用到的arm庫到板子上。 ②pwd指令獲取該庫的絕對路徑&#xff0c;把路徑復制到/etc/ld.so.conf文件 ③輸…

Leetcoder Day37| 動態規劃part04 背包問題

01背包理論基礎 面試掌握01背包&#xff0c;完全背包和重背包就夠用了。 背包問題的理論基礎重中之重是01背包&#xff0c;一定要理解透&#xff01; 01 背包 有n件物品和一個最多能背重量為w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的價值是value[i] 。每件物品…

隱式馬爾科夫算法

隱式馬爾科夫算法 隱式馬爾科夫算法概述算法使用HMM 模型參數設置HMM 模型分類1. Gaussian HMM2. Multinomial HMM3. GMM HMM 其他機器學習算法&#xff1a;機器學習實戰工具安裝和使用 隱式馬爾科夫算法概述 隱式馬爾科夫算法是一種用于處理時序數據的強大工具&#xff0c;其…

css通過calc動態計算寬度

max-width: calc(100% - 40px) .m-mj-status-drawing-info-data{ display: inline-block; margin: 10px; min-width: 200px; padding: 10px;border-radius: 10px; background: #ddd;max-width: calc(100% - 40px);word-wrap: break-word;white-space: pre-line;}我開發的chatg…

計算機二級(Python)真題講解每日一題:《字典字符查找》

描述???????????????????????????????????????????????????????????????????????????????????????????????????????????????? 在右側的答題模板中&#xf…

Crash 實例

1.spinlock原理 為了解決這個spinlock的不公平問題&#xff0c;linux 2.6.25內核以后&#xff0c;spinlock采用了一種"FIFO ticket-based"算法的spinlock機制&#xff0c;可以很好的實現先來先搶占的思想。具體的做法如下&#xff1a; (1)、spinlock的核心字段有ow…

C語言-柔性數組成員的使用

文章目錄 摘要柔性數組成員基本使用細節探究 零長度數組-定長數組-變長數組 摘要 本文先介紹柔性數組成員(flexible array member)的基本使用&#xff0c;然后介紹其內存結構。最后&#xff0c;補充了一些數組相關的其他概念。 柔性數組成員 基本使用 參考: 【C語言內功修煉…

[項目設計] 從零實現的高并發內存池(一)

&#x1f308; 博客個人主頁&#xff1a;Chris在Coding &#x1f3a5; 本文所屬專欄&#xff1a;[高并發內存池] ?? 前置學習專欄&#xff1a;[Linux學習] ? 我們仍在旅途 ? 目錄 前言 項目介紹 1.內存池 1.1 什么是內存池 池化技術 內存池 1.2 為什…

word使用bib添加參考文獻

文章目錄 安裝TexLive安裝bibtex4word使用在word中添加參考文獻使用bibtex4word在word中添加參考文獻設置參考文獻格式為畢業論文格式 參考 安裝TexLive 從下載地址下載鏡像iso文件texlive2023.iso雙擊打開iso鏡像文件運行 install-tl-windows.bat點擊安裝非常非常非常耐心地安…