- 分類:指針(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)可見(即可以訪問),需要將該符號定義爲以大字母開頭