day03
一、復合型別(指標)
1. 指標的基本操作
var a int = 10
fmt.printf("%d\n", a) //變數的記憶體
fmt.printf("%v\n", &a) //變數的位址
fmt.printf("%p\n", &a) //變數的位址
fmt.println(&a) //變數的位址
//儲存某個變數的位址,需要指標。 *int 儲存int的位址, **int 儲存 *int的位址
//定義只是乙個特殊的宣告
//定義乙個變數p,型別為 *int
var p *int
p = &a //指標變數指向誰,就把誰的位址賦值給指標變數
fmt.println(p)
*p = 666 //*p操作的不是p的記憶體,是p指向的位址的記憶體(也就是a)
fmt.println(*p)
fmt.println(a)
2. 指標不要操作沒有合法指向的記憶體
go語言指標沒有指向時是 nil (即預設值 ,c的預設是null)
var p *int
// p = nil 可以給他賦值成nil
fmt.println(p)
var p *int
// p = nil 可以給他賦值成nil
fmt.println(p)
*p = 666
//會報錯panic: runtime error: invalid memory address or nil pointer dereference
//[signal 0xc0000005 code=0x1 addr=0x0 pc=0x48b523]
//goroutine 1 [running]:
3. new函式的使用
new相當於c的動態分配空間,但是c需要手動釋放記憶體,而go有自己的自動gc,不需要手動釋放
var p *int
p = new(int) //p為指向的是int的記憶體位址,所以new(int)開闢了一塊新的int記憶體
fmt.println(p) //會輸出p指導指向的記憶體位址
fmt.println(*p) //p所指向的記憶體為int,預設值 是0,所以0
*p = 666
fmt.println(*p) //p指向的記憶體新賦值為666,所以輸出666
q := new(int) //自動推導
fmt.println(q)
*q = 777
fmt.println(*q)
4. 值傳遞
func swap(a, b int)
fmt.println(a) // [1 2 3 4 5]
b := [5]int
fmt.println(b) // [1 2 3 4 5]
//部分初始化,沒初始化的元素,會有預設值
c := [5]int
fmt.println(c) // [1 2 3 0 0]
d := [5]int //根據下標賦值
fmt.println(d)
8. 兩維陣列
有多少個 [ ] 就是多少維陣列
有多少個 [ ] 就用多少個迴圈
var a [3][4]int
var k int
for i := 0; i < 3; i++ , , }
fmt.println(b) // [[1 2 3 4] [5 6 7 8] [9 10 11 12]]
//部分初始化
c := [3][4]int, , }
fmt.println(c) // [[1 2 3 0] [5 6 7 8] [9 10 0 0]]
d := [3][4]int, }
fmt.println(d) // [[1 2 3 0] [5 6 7 8] [0 0 0 0]]
e := [3][4]int}
fmt.println(e) // [[0 0 0 0] [1 2 3 0] [0 0 0 0]]
f := [3][4]int}
fmt.println(f) // [[0 0 0 0] [0 0 3 0] [0 0 0 0]]
9. 陣列的比較和賦值
//陣列比較
//只支援 == 和 != 而且比較的兩個陣列型別要一樣(比較是不是第乙個元素都都一樣)
a := [4]int
// b := [3]int
c := [4]int
d := [4]int
// fmt.println(a == b) 型別不一樣,比較會報錯
fmt.println(a == c) //true
fmt.println(a == d) //false
//陣列賦值
e := a
fmt.println(e) //[1 2 3 4]
10. go的隨機數
//設定種子,只需要一次
// rand.seed(666)
//如果種了引數一樣,每次產生的隨機數都是一樣的(所以我們有時間)
rand.seed(time.now().unixnano()) //當前系統時間作為種子引數
for i := 0; i < 5; i++
modify(a)
fmt.println("main ", a) //main [1 2 3 4]
12. 陣列指標傳遞.go
func modify(a *[4]int)
modify(&a) //位址傳遞
fmt.println("main ", a) //main [666 2 3 4]
三、復合型別(切片slice)
13. 切片說明
陣列使用時缺點:大小是固定的,宣告時必須指定長度,容量不能擴容,作為函式引數時,會把整個陣列都拷貝一遍
切片就是為了彌補陣列的缺點,切片不是陣列也不是陣列的指標(可以理解為可變長的陣列)。切片是一種引用型別,底層總是指向乙個array,切片的宣告也像陣列一樣,只是不需要長度
14. 切片長度和容量
a := int
// [low:high:max]
// low: 下標的起點
// high: 下標的終點(不包括些下標)
// leng: 長度 high-low
// cap: 容量 max-low
s := a[1:3:4]
fmt.println(s) // [2 3]
fmt.println(len(s)) //切片長度2 3-1
fmt.println(cap(s)) //切片長度3 4-1
15. 陣列和切片區別
//陣列和切片的區別
//陣列的 裡面的長度,是乙個常量,陣列不能修改長度,len和cap是固定的這裡是5
a := [5]int{} //陣列
fmt.println(a) // [0 0 0 0 0]
fmt.println(len(a)) // 5
fmt.println(cap(a)) // 5
//切片 裡面是空的或者是...( [...]int),切片的長度和容量是不固定的
s := int{} //切片
fmt.println(s) //
fmt.println(len(s)) // 0
fmt.println(cap(s)) // 0
fmt.println(s) // [11]
fmt.println(len(s)) // 1
fmt.println(cap(s)) // 1
16. 切片的建立
//自動推導,同時初始化
s := int
GoLang學習基礎筆記
1 make 分配 內部函式 make t,args 的服務目的和 new t 不同,只生成切片,對映和程道,並返回乙個初始化的 不是零 的,type t的,不是 t 的值。這種區分的原因是,這三種型別的資料結構必須在使用前初始化.比如切片是乙個三項的描述符,包含資料指標 陣列內 長度,和容量 在這...
Golang基礎學習筆記01
day01 一 基礎 1.單行注釋 2.多行注釋 3.語句結尾沒有分號 4.呼叫函式大部分需要匯入包 5.左括號必須與函式名同行 6.程式必須有乙個main包 7.go語言以包做為管理單位 8 每個檔案必須先宣告包 二 變數 9.變數命名規範 1 字母 下劃線 數字組成 2 不能以數字開頭 3 不能...
Golang學習筆記 03 庫原始碼檔案
庫原始碼檔案 不能被直接執行的原始碼檔案,它僅用於存放程式實體,這些程式實體可以被其他 使用。包宣告的基本規則 1.同目錄下的原始碼檔案的 包宣告語句要一致。也就是說,它們要同屬於乙個 包 package 這對於所有原始碼檔案都是適用的。如果目錄中有命令原始碼檔案,那麼其他種類的原始碼檔案也應該宣告...