Go語言基礎之複合類型

  • 分類:指針(pointer)、數組(arry)、切片(slice)、字典(map)、結構體(struct)

一、指針

1. 基本操作

  • 默認值nil, 沒有NULL常量
  • 操作符"&"取變量地址
  • "*"通過指針訪問目標對象
    • 保存某個變量的地址,需要指針類型
    • *int保存int的地址
  • 不支持指針運算,不支持"->"運算符
  • 直接用“.”訪問目標成員
  • 不能操作沒有合法指向的內存

2. new函數

func main() {
    var p1 *int
    p1 = new(int) //p1爲*int 類型, 指向匿名的int變量
    fmt.Println("*p1 = ", *p1) //*p1 =  0

    p2 := new(int) //p2爲*int 類型, 指向匿名的int變量
    *p2 = 111
    fmt.Println("*p2 = ", *p2) //*p1 =  111
}

3. 指針做函數參數

func swap01(a, b int) {
    a, b = b, a
    fmt.Printf("swap01 a = %d, b = %d\n", a, b)
}

func swap02(x, y *int) {
    *x, *y = *y, *x
}

func main() {
    a := 10
    b := 20

    //swap01(a, b) //值傳遞
    swap02(&a, &b) //變量地址傳遞
    fmt.Printf("a = %d, b = %d\n", a, b)
}

二、數組

1. 定義數組

var a [10]int // 定義一個有10個數的數組
var a [2]int = [2]int{1, 2, 3}
b := [3]int{1, 2, 3, 4}

  • 沒有初始化的元素,自動賦值爲0

  • 指定某個元素值

    c := [3]int{1:111, 2:222} //下標爲1的值爲111

  • 獲取數組長度:len()、cap()容量

2. 二維數組
  • 初始化二維數組
    b := [3][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}
    
3. 數組比較和賦值
  • 數組支持比較
  • 同類型的數組可以賦值
4. 隨機數
package main

import "math/rand"

func main() {
	rand.Seed(123)  // 設置種子參數,參數一樣,獲取到的隨機數一樣
	rand.Int()  // 隨機獲取一個很大的數
	rand.Intn(100)  //限制隨機數範圍
} 
5. 排序
  • 冒泡排序

三、切片(slice)

  • slice並不是真正意義上的動態數組,而是一個引用類型。
  • slice總是指向一個底層array
  • slice的聲明也可以像array一樣,只是不需要長度

1. 切片和數組的區別

  • 數組[]裏的長度是固定的一個常量,數組不能修改長度
  • 聲明slice時,方括號內沒有任何字符。

2. 切片的操作

  • array := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
操作 結果 len cap 說明
array[:6:8] [0 1 2 3 4 5] 6 8 省略 low
array[5:] [5 6 7 8 9] 5 5 省略 high、 max
array[:3] [0 1 2] 3 10 省略 high、 max
array[:] [0 1 2 3 4 5 6 7 8 9] 10 10 全部省略

3. 內建函數

1. append
  • 向切片尾部添加數據
  • 一旦超過原底層數組容量,通常以2倍容量重新分配底層數組,並複製原來的數據
2. copy
  • 在兩個 slice 間複製數據,複製⻓度以 len 小的爲準,兩個 slice 可指向同⼀底層數組

四. map

  • map裏所有鍵的數據類型必須是相同的,值也必須如何
  • 鍵和值的數據類型可以不相同
  • map是無序的

1. 創建和初始化

1) 創建

var m1 map[int]string //只是聲明一個map,沒有初始化, 此爲空(nil)map
m2 := map[int]string{}
m3 := make(map[int]string)
m4 := make(map[int]string, 10) //第2個參數指定容量

2) 初始化
//1、定義同時初始化
var m1 map[int]string = map[int]string{1: "mike", 2: "yoyo"}
fmt.Println(m1) //map[1:mike 2:yoyo]

//2、自動推導類型 :=
m2 := map[int]string{1: "mike", 2: "yoyo"}
fmt.Println(m2)

2. 常用操作

1. 遍歷
  • 迭代遍歷,第一個返回值是key,第二個返回值是value
2. 刪除

delete(m1, 2) // //刪除key值爲3的map

3. map做函數參數
  • 在函數間傳遞映射並不會製造出該映射的一個副本,不是值傳遞,而是引用傳遞

五、結構體

  • 結構體是一種聚合的數據類型
  • 它是由一系列具有相同類型或不同類型的數據構成的數據集合。
  • 每個數據稱爲結構體的成員
  • p.成員 和(*p).成員 操作是等價的
  • 結構體是可以比較的,兩個結構體將可以使用 == 或 != 運算符進行比較,但不支持 > 或 <

可見性

  • 要使某個符號對其他包(package)可見(即可以訪問),需要將該符號定義爲以大字母開頭
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章