golang 讀書筆記

來源:互聯網
上載者:User

介紹

Go語言是一種讓代碼分享更容易的程式設計語言。Go語言內建一些工具,讓使用別人寫的包更容易,並且分享自己寫的包更容易。

Go語言對並發的支援是這門語言最重要的特性之一。goroutine很像線程,但是它佔用的記憶體遠少於線程,使用它需要的代碼更少。通道(channel)是一種內建的資料結構,可以讓使用者在不同 的goroutine之間同步發送具有類型的訊息。

術語

goroutine 是可以與其他goroutine並存執行的函數,同時也會與主程式(程式的入口)並存執行。

個人理解: 相當於其他語言的多線程

channel 一種資料結構,可以讓goroutine之間進行安全的資料通訊。

可以避免像其他語言裡常見的共用記憶體訪問的問題。

鴨子類型 如果它叫起來像鴨子,那它就可能是只鴨子

規範

  • 如果介面類型只包含一個方法,那麼這個類型的名字以er結尾

Go語言的類型系統

  1. 類型簡單
  2. Go介面對一組行為建模

空白標識符(_) 用來拋棄不想繼續使用的值,如給匯入的包賦予一個空名字,或者忽略函數返回的你不感興趣的值。
init函數 每個包可以包含任意多個init函數,所有被編譯器發現的init函數都在main函數之前執行。

文檔

命令列擷取

go doc fmt

瀏覽文檔

godoc -http=:6060
包含所有Go標準庫和你的GOPATH下Go原始碼的文檔

函數的文檔直接寫在函式宣告之前,使用人類可讀的句子編寫。如果想給包寫一段文字量比較大的文檔,可以在工程裡包含一個叫作doc.go的檔案,使用同樣的包名,並把包的介紹使用注釋加在包名聲明之前。

資料類型

參考型別 切片、map、channel(通道)、介面、函數, 當聲明上述類型的變數時,建立的變數被稱作 Header 值
數組 固定長度。用於儲存一段具有相同的類型的元素的連續塊
如果使用 ... 代替數組長度,則更具初始化時數組元素的數量來確定該數組的長度

// 聲明一個包含5個元素的整型數組var array [5]int// 用具體值初始化每個元素array := [5]int {1, 2, 3, 4, 5}// 容量由初始化值的數量決定array := [...]int {1, 2, 3, 4, 5}// 用具體值初始化索引為1,2 的元素,其餘則保持0array := [5]int {1: 1, 2: 2}

切片 動態數組,可以按需自動成長和縮小。

在64位架構機器上, 一個切片需要24位元組的記憶體: 指標欄位需要8位元組,長度和容量欄位分別需要8位元組。

// 建立一個字串切片,其長度和容量都是5個元素slice := make([]string, 5)// 長度為3個元素,容量為5個元素 不容許建立容量小雨長度的切片slice := make([]int, 3, 5)// 建立 nil 整型切片var slice []int

如果在 [] 運算子中指定了一個值,那麼建立的就是數組而不是切片

//建立有3個元素的整型數組array := [3]int {10, 20, 30}//建立長度和容量都是3的整型切片slice := []int {10, 20, 30}
  • 賦值和切片
    建立一個新切片就是把底層數組切出一部分
//建立一個整型切片,其長度和容量都是5個元素slice := []int{1,2,3,4,5}//建立一個新切片,其長度為2個元素,容量為4個元素newSlice := slice[1:3]

對於底層數組容量是k的切片 slice[i:j] 來說
長度: j - i
容量: k - i

  • 切片增長
    append 總是增加新切片的長度,而容量則有可能會改變,容量改變取決於被操作的切片的可用容量

  • 建立切片時的第3個索引
    第三個索引可以用來控制新切片的容量,其目的並不是要增加容量,而是要限制容量

    slice[i:j:k]
    長度 j - i
    容量 k - i

  • 迭代
    range 返回兩個值。第一個值是 索引 第二個對應位置元素值的一份副本

map
儲存一系列無序索引值對

自訂類型

  1. 使用關鍵字struct建立一個結構類型
type User struct {    ID string }
  1. 基於一個已有類型,將其作為新類型的類型說明
type Duration int64// int64類型叫作Duration的基礎類型。Go 並不認為 Duration 和 int64 是同一類型。這兩個類型是完全不同的有區別的類型。

struct

struct 有2中方法, 值方法和指標方法

  • 值方法 調用時會使用這個值的一個副本來執行
  • 指標方法 調用時使用這個值的引用來執行

    也可以使用指標來調用值方法,編譯器轉換後的代碼
    (*obj).method()
    也可以使用值來調用引用方法,編譯器轉換後的代碼
    (&ojb).method()

聲明一個方法時使用 值方法 還是 指標方法,取決於想得到一個新值還是想修改原有的值

介面
用來定義行為

channel

unbuffered := make(chan int)    //無緩衝通道buffered := make(chan int, 10)
  • 無緩衝的通道 在接收前沒有能力儲存任何值的通道

總結

  • Go語言是現代的、快速的、帶有一個強大的標準庫。
  • Go語言內建對並發的支援。
  • Go語言使用介面作為代碼複用的基礎模組。
  • 每個代碼檔案都屬於一個包,而包名英國與代碼檔案所在的檔案夾同名
  • Go語言提供了多種聲明和初始設定變數的方式。如果變數的值沒有顯式初始化,編譯器會將變數初始化為零值。
  • 使用指標可以在函數間活著goroutine間共用資料。
  • 通過啟動goroutine和使用通道完成並發和同步
  • Go語言提供了內建函數來支援Go語言內部的資料結構。
  • Go語言中包是組織代碼的基本單位
  • 環境變數GOPATH決定了Go原始碼在磁碟上被儲存、編譯和安裝的位置。
  • 可以為悲歌工程設定不同的GOPATH,以保持原始碼和依賴的隔離。
  • Go工具是在命令列上工作的最好工具
  • 開發人員可以使用go get 來擷取別人的包並將其安裝到自己的GOPATH指定目錄
  • 要為別人建立包很簡單,只要吧原始碼放到公用程式碼程式庫,並遵守一些簡單的規則就可以了。
  • Go語言在設計時將分享代碼作為語言的核心特性和驅動力。
  • 推薦使用依賴管理工具來管理依賴 如 godep, vender, gb
  • 數組結構是切片和map的基石
  • Go語言裡切片經常用來處理資料的集合,map用來處理具有簡直對結構的資料
  • 內建函數make可以建立切片和map,並指定原始的長度和容量。也可以直接使用切片和map字面量,活著使用字面量的初始值。
  • 切片有容量限制,不過可以使用內建的append函數擴充容量。
  • map的增長沒有容量或者任何限制
  • 內建函數len可以用來擷取切片或者map的長度
  • 內建函數cap只能用於切片 (cap()函數返回的是數組切片分配的空間大小)
  • 通過組合,可以建立多維組和多維切片。也可以使用切片或者其他map作為map的值。但是切片不能用作map的鍵
  • 將切片或者map傳遞給函數成本很小,並且不會複製底層的數組結構。
  • 使用關鍵字 struct 或者指定已經存在的類型,可以聲明使用者定義的類型。
  • 方法提供了一種給使用者定義的類型增加行為的方式。
  • 設計類型時需要去人類型的本質是原始的,還是非原始的。
  • 介面是聲明了一組行為並支援多態的類型。
  • 嵌入類型提供了擴充類型的能力,而無需使用繼承。
  • 標識符要麼是從包裡公開的,要麼是在包裡未公開的。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.