四、Go语言复合数据类型(上)
@Author:Runsen
復合數據類型主要包含Go中的一些復雜類型,主要有指針類型,數組類型,切片類型,結構體類型,Map類型和Channel類型
文章目錄
- 指針
- 數組
- 切片
指針
相信大家都在在C語言聽過指針。首先指針是一個變量,全名叫做指針變量,只不過這個變量里面存儲的值是一個地址而已。所以指針,哪怕是空指針,都是有地址的,因為變量都是有地址的。
變量其實是一種使用方便的占位符,引用計算機中的內存地址。指針其實也就是把某個變量指向到特定內存地址,類似于Linux中的軟鏈概念。
不用單獨開辟出一塊內存用于存儲,而是把新變量的實際內存指向到已占有內存空間的現變量中。Go語言中取變量地址符用 &,聲明一個指針類型用 *,比如聲明一個int型的指針類型
下面舉一個例子,代碼如下:
package mainimport "fmt"func main() {var a * intfmt.Printf("&a: %v, a:%v \n",&a,a) b := 1fmt.Printf("&b: %v, b:%v \n",&b,b) a = &bfmt.Printf("&a: %v, a:%v \n",&a,a) fmt.Printf("&b: %v, b:%v \n",&b,b) }&a: 0xc000006028, a:<nil> &b: 0xc0000120f0, b:1 &a: 0xc000006028, a:0xc0000120f0 &b: 0xc0000120f0, b:1從輸出我們可以看到空指針a的地址是存在,在a指向b之前,指針a的值為nil,指向b之后,數值變成了變量b的地址,而對a 做操作*a的話,數值為變量b對應的數值1。
數組
數組是具有相同唯一類型的一組已編號且長度固定的數據項序列。
格式規則為:var variable_name [SIZE] variable_type。
比如定義一個長度為3,類型是int的數組:var a [3]int
注意:長度必須是常量,它是數組類型的一部分,一旦定義,長度不能改變。
初始化數組時可以使用初始化列表來設置數組元素的值,具體如下面的代碼所示。
package mainimport "fmt"func main() {var testArray [3]int //數組會初始化為int類型的零值var numArray = [3]int{1, 2} //使用指定的初始值完成初始化var cityArray = [3]string{"北京", "上海", "廣州", "深圳"} //使用指定的初始值完成初始化fmt.Println(testArray) //[0 0 0]fmt.Println(numArray) //[1 2 0]fmt.Println(cityArray) //[北京 上海 廣州 深圳]// 我們還可以使用指定索引值的方式來初始化數組,例如:a := [...]int{1: 1, 3: 5}fmt.Println(a) // [0 1 0 5] }數組的遍歷有兩種方法,分別是for range和通過索引遍歷。
package mainimport "fmt"func main() {var a = [...]string{"北京", "上海", "廣州", "深圳"}// 通過索引遍歷數組for i := 0; i < len(a); i++ {fmt.Println(a[i])}fmt.Println("================")// 用for range遍歷數組for _, v := range a {fmt.Println(v)} }其實多維數組和一維數組定義完全相同:var 數組名 [數組大小][數組大小]類型
下面我們定義一個二維數組,具體代碼如下。
package mainimport "fmt"func main() {var cities = [3][2]string{{"北京", "上海"},{"廣州", "重慶"},{"深圳", "東莞"},}fmt.Println(cities) //[[北京 上海] [廣州 重慶] [深圳 東莞]]fmt.Println(cities[0][0]) //北京 }切片
因為Go 數組的長度不可改變,在特定場景中這樣的集合就不太適用,于是Go中提供了一種靈活,功能強悍的內置類型切片(“動態數組”),與數組相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大,這個就是切片。
聲明一個未指定大小的數組來定義切片:var identifier []type。因此,切片不需要說明長度。
很多人使用make()函數來創建切片:,具體如下。
var slice1 []type = make([]type, len) // 也可以簡寫為 slice1 := make([]type, len)切片是可索引的,并且可以由 len() 方法獲取長度。
切片提供了計算容量的方法 cap() 可以測量切片最長可以達到多少。
下面我們具體使用下切片,具體代碼如下。
package mainimport "fmt"func main(){var numbers = make([]int,3,5)// 兩個代碼相同// umbers := make([]int, 3,5)fmt.Printf("len=%d, cap=%d, slice=%v\n",len(numbers),cap(numbers),numbers) //len=3, cap=5, slice=[0 0 0] }切片截取是通過設置下限及上限來設置截取切片[lower-bound:upper-bound],具體實例如下:
package mainimport "fmt"func printSlice(x []int){fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x) }func main() {/* 創建切片 */numbers := []int{0,1,2,3,4,5,6,7,8,9} printSlice(numbers)/* 打印原始切片 */fmt.Println("numbers ==", numbers)/* 打印子切片從索引1(包含) 到索引4(不包含)*/fmt.Println("numbers[1:4] ==", numbers[1:4])/* 默認下限為 0*/fmt.Println("numbers[:3] ==", numbers[:3])/* 默認上限為 len(s)*/fmt.Println("numbers[4:] ==", numbers[4:])numbers1 := make([]int,0,5)printSlice(numbers1)/* 打印子切片從索引 0(包含) 到索引 2(不包含) */number2 := numbers[:2]printSlice(number2)/* 打印子切片從索引 2(包含) 到索引 5(不包含) */number3 := numbers[2:5]printSlice(number3)}執行以上代碼輸出結果為:
len=10 cap=10 slice=[0 1 2 3 4 5 6 7 8 9] numbers == [0 1 2 3 4 5 6 7 8 9] numbers[1:4] == [1 2 3] numbers[:3] == [0 1 2] numbers[4:] == [4 5 6 7 8 9] len=0 cap=5 slice=[] len=2 cap=10 slice=[0 1] len=3 cap=8 slice=[2 3 4] [Finished in 1.3s]總結
以上是生活随笔為你收集整理的四、Go语言复合数据类型(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 五、Go语言复合数据类型(下)
- 下一篇: 股票分红是好事还是坏事