GO語言學習 三 指標,切片,map對映

2021-09-02 10:56:19 字數 4482 閱讀 4845

1.指標

func main()
go語言雖然保留指標,但與其它程式語言不同的是

1)預設值是nil,沒有null常量

2)操作符"&「是取變數位址,」*「通過指標訪問目標物件

3)不支援指標運算,不支援 「->」 運算子,直接用」."訪問目標成員

go語言指標定義

func main()
指標交換a,b值

func swap(a, b *int)

func main()

一維陣列賦值

func main() 

fmt.println("a =", a)

b := [5]int

fmt.println("b =", b)

//部分初始化,沒有初始化的元素自動賦值為0

c := [5]int

fmt.println("c =", c)

//指定某個元素初始化

d := [5]int

fmt.println("d =", d)

}

二維陣列賦值

func main() , , }

fmt.println(e)

//部分初始化,只對第二行元素賦值

f := [3][4]int}

fmt.println(f)

}

兩陣列間支援比較和賦值,只支援 == 或 !=,比較是不是每個元素都一樣,兩個陣列比較,陣列型別要一樣。

2.隨機數生成與氣泡排序

func main() 

fmt.printf("\n")

//氣泡排序,挨著的2個元素比較,公升序(大於交換)

for i :=0; ia[j+1]}}

fmt.println("有序後:")

for i:=0; i < n; i++

}

陣列做函式引數,它是值傳遞。實參陣列的每個元素給行引數組拷貝乙份。如果需要用函式改變陣列的值,用指標。

//陣列做函式引數,它是值傳遞

//實參陣列的每個元素給行引數組拷貝乙份

func modify(p *[5]int)

func main()

modify(&a)

fmt.println(a)

}

2.切片

func main() 

s := array[0:3:5]

//[low:high:max]

//low下標的起點

//high下標的終點(不包括此下標),左閉右開

//len=high-low

//cap = max - low 容量

fmt.println("s = ", s)

fmt.println("len(s) = ", len(s)) //長度=3-0

fmt.println("cap(s) = ", cap(s)) //容量=5-0

//切片與陣列的區別

//陣列裡面的長度是固定的乙個常量,陣列不能修改長度,len和cap永遠固定

a := [5]int{}

fmt.printf("len = %d, cap = %d\n", len(a), cap(a))

//切片,裡面為空,或者為...切片的長度或容量可以不固定

s := int{}

fmt.printf("len = %d, cap = %d\n", len(s), cap(s))

}

切片的建立

//自動推導型別,同時初始化

s1 := int

fmt.println("s1 =", s1)

//借助make函式,格式make(切片型別, 長度, 容量)

s2 := make(int, 5, 10)

fmt.printf("len = %d, cap = %d\n", len(s2), cap(s2))

//容量可預設,預設時容量等於長度

切片操作

array := int

s1 := array[:] //[0:len(array):len(array)],不指定時容量和長度一樣

fmt.println(s1)

fmt.printf("len = %d, cap = %d\n", len(s1), cap(s1))

//操作某個元素,和陣列操作方式一樣

data := array[0]

fmt.println(data)

s2 := array[3:6:7]

fmt.printf("len = %d, cap = %d\n", len(s2), cap(s2))

s3 := array[:6] //從0開始,取6個元素,容量為10

fmt.printf("len = %d, cap = %d\n", len(s3), cap(s3))

s4 := array[3:] //從下標為3開始到結尾

fmt.println(s4) //取7個元素,容量為7

fmt.printf("len = %d, cap = %d\n", len(s4), cap(s4))

切片與底層陣列的關係

array := int

//新切片修改後原陣列也發生改變

s1 := array[2:5]

s1[1] = 666

fmt.println(s1)

fmt.println(array)

fmt.printf("len = %d, cap = %d\n", len(s1), cap(s1))

//另外新切片,切片的切片

s2 := s1[2:7]

s2[2] = 777

fmt.println(s2)

fmt.println(array)

func test(m map[int]string)

func main()

fmt.println("m4 =", m4)

//遍歷

for key, value := range m4

//如何判斷乙個key是否存在

//第乙個返回值為key所對應的value,第二個返回值為key是否存在的條件,存在ok為true

value, ok := m4[1]

if ok == trueelse

//刪除某個值

delete(m4, 1) //刪除key為1的內容

fmt.println(m4)

//將刪除操作寫在函式內部

test(m4) //在函式內部刪除某個key

fmt.println("m4 = ", m4)

}

2.定義結構體

//結構體型別

//有時我們需要將不同資料型別的陣列合成乙個有機的整體

//定義乙個結構體型別

type student struct

func main()

fmt.println("s1 =", s1)

//指定成員初始化,沒有初始化

s2 := student

fmt.println("s2 =", s2)

//初始化指標變數

var s3 *student = &student

fmt.println("s3 =", *s3)

s4 := &student

fmt.println("s4 =", *s4)

}

結構體指標變數

//1.指標有合法指向後,才操作成員

//先定義乙個普通結構體變數

var s student

//再定義乙個指標變數,儲存s的位址

var p1 *student

p1 = &s

//通過指標操作成員,p1.id和(*p).id完全等價,只能用.運算子

p1.id = 1

p1.name = "mike"

p1.*** = 'm'

p1.age = 18

p1.addr = "bj"

fmt.println("p1 = ",p1)

//2.通過new申請乙個結構體

p2 :=new(student)

p2.id = 1

(*p2).name = "mike"

p2.*** = 'm'

p2.age = 18

p2.addr = "bj"

fmt.println("p2 = ",p2)

如果想使用別的包的函式,結構體型別,結構體成員

函式名,型別名,結構體成員變數名,首字母必須大寫,可見

如果首字母是小寫,只能在同乙個包裡使用

go語言學習 陣列 切片 map

go語言中陣列的特點 陣列的長度是固定的,並且長度也是陣列型別的一部分 是值型別,在賦值或者作為引數傳遞時,會複製整個陣列,而不是指標 定義陣列的語法 var arr1 5 int 5 int 未初始化的值,就預設初始化為該型別的預設值 var arr2 int 3 int 長度可由初始化的元素個數...

Go語言學習筆記九 指標

指標的概念是當時學c語言時了解的。go語言的指標感覺與c語言的沒啥不同。指標變數是儲存記憶體位址的變數。其他變數儲存的是數值,而指標變數儲存的是記憶體位址。這個記憶體位址可能儲存者乙個基本數值。指標變數也是有型別的。它需要知道自己儲存的記憶體位址指向數值的型別,因為不同的數值型別占用的空間大小是不同...

C語言學習(三) 指標

指標的定義int p char p float p指標變數所佔記憶體的大小 跟前面定義的型別無關 而跟系統有關 16bits作業系統 2b 32bits作業系統 4b 64bits作業系統 8b 指標指向乙個值所在的第乙個位元組 通常乙個位址存放乙個位元組 const修飾指標 指標指向乙個字串時 如...