Go之基礎知識二

前言

上一篇主要分享了工作區目錄結構、代碼包導入方式、相關命令、程序實體和關鍵字、變量和常量等相關的知識點,那麼本文作為第二篇,主要講解的內容有:數值類型、字符串類型、數組和切片、字典、通道。


基礎知識

一、數值類型

1、整型

Go語言的整數類型一共有10個:int、int8、int16、int32、int64、uint、uint8、uint16、uint32、uint64,可能我們比較常用的就是默認的int和uint,它們隨計算機架構不同所佔空間也會不一樣,而空間的表示法有比特bit或字節byte(1byte=8bit),具體的差別如下圖所示:

Go之基礎知識二

另外整型的表示法還有八進制、十六進制,示例如下:

十進制:var num int = 12

八進制:var num int = 014 // 用“0”作為前綴以表明這是8進製表示法

十六進制:var num int = 0xC // 用“0x”作為前綴以表明這是16進製表示法

2、浮點型

浮點數類型有兩個,即float32和float64,分別佔4字節和8字節。

浮點數類型的值一般由整數部分、小數點“.”和小數部分組成,不過表示方式卻多樣化:

正常表示:var num float32 = 0.037

指數表示:var num float32 = 3.7E-2

簡化表示:var num float32 = .037

3、複數類型

複數類型同樣有兩個,即complex64和complex128,分別佔8字節和16字節。

複數類型的值一般由浮點數表示的實數部分、加號“+”、浮點數表示的虛數部分,以及小寫字母“i”組成,比如:3.7E+1 + 5.98E-2i 等同於 37.000000 + 0.059800i

4、byte與rune

byte與rune類型有一個共性,即:它們都屬於別名類型。byte是uint8的別名類型,而rune則是int32的別名類型。(用的比較少,瞭解一下即可)


二、字符串類型

字符串類型是用string表示。

聲明及賦值:var str string = "Hello,World"

簡約賦值:str := "Hello,World" // 此種方式是適應任何類型的,因為go語言中會自動識別類型。

與字符串相關的包是strings,裡面有很多操作字符串的方法,具體使用就不在此贅述。


三、數組和切片

數組是固定長度的容器,以對應下標進行賦值和取值,通過len()方法獲取長度,通過cap()方法獲取容量,這兩者值是一致的,默認值為零值(視具體類型而定,比如int就為0,string就為空),它是值類型。

切片是不定長度的容器,也是以對應下標進行賦值和取值,長度是切片上限值與下限值之差,容量也是通過cap()方法進行獲取,但這兩者值可能是不一致的,並且切片可以通過append()方法進行擴容,另外還能通過copy()方法進行復制,它是引用類型。

// 聲明數組,這一塊要跟type區別開來,type是聲明別名,var才是聲明變量
// 先聲明別名,後聲明變量
type array1 [3]int
var a1 array1
fmt.Printf("%v\\n", a1)

// 直接聲明變量
var a2 [3]int
var a3 [3]string
fmt.Printf("%v, %v, len=%d, cap=%d\\n", a2, a3, len(a2), cap(a2))
a2[0] = 1
fmt.Printf("%v\\n", a2)

// 聲明並賦值
var a4 = [3]int{1, 2, 3}
var a5 = [...]int{1, 2, 3}
a6 := [3]int{1, 2, 3}
a7 := [...]int{1, 2, 3}
fmt.Printf("%v, %v, %v, %v\\n", a4, a5, a6, a7)

// 聲明切片,注意是不定長度的
type slice1 []int
var s1 slice1
fmt.Printf("%v\\n", s1)

var slice2 []int
var slice3 []string
fmt.Printf("%v, %v, len=%d, cap=%d\\n", slice2, slice3, len(slice2), cap(slice2))
slice2 = append(slice2, 1, 2)
fmt.Printf("%v, len=%d, cap=%d\\n", slice2, len(slice2), cap(slice2))
var slice4 = []int{0, 0, 0, 0, 0}

copy(slice4, slice2)
fmt.Printf("%v, len=%d, cap=%d\\n", slice4, len(slice4), cap(slice4))

// 數組和切片共用
var array2 = []int{1, 2, 3, 4, 5}
slice5 := array2[1:4:5]
fmt.Printf("%v, len=%d, cap=%d", slice5, len(slice5), cap(slice5))

關於這一塊的知識點,說起來其實沒多少,真正用起來的時候各種場景靈活多變,所以不在此過多闡述,還是要多實踐,真金不怕火煉,實踐出真知。


四、字典

字典類型用map表示,通用表示為map[K]T,其中“K”意為鍵的類型,而“T”則代表元素(或稱值)的類型。

聲明:var num map[int]string

簡約賦值:num := map[int]string{0:"0", 1:"1", 2:"2"}

取值:v := num[0]

修改值:num[1] = "11"

添加值:num[3] = "3"

刪除值:delete(num, 2)

判斷鍵是否存在:e, ok := num[5] // 不存在ok為false,但是也能取到值,不過是默認空值


五、通道

通道(Channel)是Go語言中一種非常獨特的數據結構。它可用於在不同Goroutine之間傳遞類型化的數據,並且是併發安全的。相比之下,我們之前介紹的那些數據類型都不是併發安全的。這一點需要特別注意。

通道類型的表示方法很簡單,僅由兩部分組成,即:chan T,其中T為類型。

1、緩衝通道

創建並賦值:ch1 := make(chan string, 5) // 創建用make,通道類型為string,後面的5為長度

向通道發送數據:ch1

從通道接收數據:value :=

判斷通道是否開啟:value, ok :=

關閉通道:close(ch1)

2、非緩衝通道

指發送方在向通道發送數據的時候會立即被阻塞,直到有某一個接收方已從該通道中接收了這條數據。

創建並賦值:ch1 := make(chan string, 0) // 跟緩衝通道差不多,只是最後的長度為0

其它操作跟緩衝通道一致。

3、單向通道

單向通道是指只能進行一個方向的通道,要麼只接收數據,要麼只發送數據。

聲明接收通道:type Receiver

聲明發送通道:type Sender chan

舉例如下:

Go之基礎知識二


分享到:


相關文章: