Golang基礎學習筆記03

2021-09-11 20:46:35 字數 3815 閱讀 1951

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 這對於所有原始碼檔案都是適用的。如果目錄中有命令原始碼檔案,那麼其他種類的原始碼檔案也應該宣告...