結(jié)構(gòu)體定義和使用
#pargram mark 結(jié)構(gòu)體定義
結(jié)構(gòu)體的賦值和比較
type Stud struct { name string age int sex string }
結(jié)構(gòu)體切片
type Student struct{ name string age int } ? //var slice []結(jié)構(gòu)體數(shù)據(jù)類(lèi)型 ? //var slice []Student=make([]Student,5) //slice[0] = Student{"劉備", 50, "男", 60, "巴蜀"} ? var slice []Student slice = append(slice, Student{"劉備", 50}, Student{"孫尚香", 20, "女"}, Student{"甄宓", 28, "女"}) //在內(nèi)存中存儲(chǔ)兩個(gè)相同內(nèi)容 獨(dú)立內(nèi)存地址的數(shù)據(jù) //修改一個(gè)不影響另外一個(gè) s := make([]Student, 3) copy(s, slice)
結(jié)構(gòu)體作為map的值
m:=make(map[int]Student) ? //賦值 m[1001] = Student{"a",20} m[1002] = Student{"b",30} m[1003] = Student{"c",20} m[1004] = Student{"f",18} //注意:將結(jié)構(gòu)體作為map的value時(shí) 在修改數(shù)據(jù)時(shí) 必須整體修改 m[1003] = Student{"修改",17} ? //可以獲取 ,,不能修改 fmt.Println(m[1001].name) ? //遍歷map中的數(shù)據(jù) for k,v:=range m { fmt.Println(k,v) } ? delete(m,1003) delete(m,1001) fmt.Println(m) ? /************** 結(jié)構(gòu)體map值為切片 **********/ m:=make(map[int][]Student) ? m[1001] = []Student{ {"A",20}, {"B",18}, } ? m[1002] = []Student{ {"C",17}, {"F",20}, } ? fmt.Println(m) ?
結(jié)構(gòu)體嵌套結(jié)構(gòu)體
type Person struct { name string age int sex string ? //結(jié)構(gòu)體不能嵌套本結(jié)構(gòu)體 在創(chuàng)建結(jié)構(gòu)體時(shí) 無(wú)法預(yù)知內(nèi)存大小 (不要相互引用 A引用A,或是A引用B,B引用A) //Person//err } ? //結(jié)構(gòu)體嵌套寫(xiě)法1 type Teacher1 struct{ p Person subject string worktime int } //結(jié)構(gòu)體嵌套寫(xiě)法2 type Teacher2 struct{ //如果結(jié)構(gòu)體嵌套結(jié)構(gòu)體 通過(guò)匿名字段使用結(jié)構(gòu)體 Person //匿名字段 subject string worktime int } ? //結(jié)構(gòu)體初始化 var tea Teacher1 = Teacher1{Person{"法師", 32, "男"}, "go語(yǔ)言開(kāi)發(fā)", 10} //修改成員變量 tea.p.name = "大帥哥" fmt.Println(tea.p.name) ? //結(jié)構(gòu)體初始化 var tea Teacher2 = Teacher2{Person{"法師 ", 32, "男"}, "go語(yǔ)言開(kāi)發(fā)", 10} //修改數(shù)據(jù) tea.name = "大帥哥" fmt.Println(tea.name)
結(jié)構(gòu)體作為函數(shù)參數(shù)
/******************** 值傳遞 形參不能修改實(shí)參的值 ********************/ //結(jié)構(gòu)體變量作為函數(shù)參數(shù) func test (s students){ fmt.Println(s) } ? //結(jié)構(gòu)體數(shù)組作為函數(shù)參數(shù) func test1(arr [3]int){ fmt.Println(arr) } //結(jié)構(gòu)體數(shù)組作為函數(shù)參數(shù)是值傳遞 形參不能修改實(shí)參的值 arr:=[3]Student{"法師",32,男"},{"玉姐",18,"女"},{"丁丁",26,"男"}} test1(arr) ? /******************** 地址傳遞(引用傳遞) 形參可以修改實(shí)參的值 map,slice ********************/ //結(jié)構(gòu)體切片作為函數(shù)參數(shù) func test2(slice []Students) { fmt.Printf("%p\n", slice) slice[0].name = "大帥哥" } //結(jié)構(gòu)體map作為函數(shù)參數(shù) func test3(m map[int]Students) { //修改 //m[1001]=Students{"大帥哥",32,"男"} //刪除 //delete(m,1001) //添加數(shù)據(jù) m[1111]=Students{"大光頭",40,"男"} } slice := [] Student{{"法師", 32, "男"}, {"玉姐", 18, "女"}, {"丁丁", 26, "男"}} test2(slice) ? m := map[int] Student{1001: {"法師", 32, "男"}, 1003: {"玉姐", 18, "女"}, 1008: {"丁丁", 26, "男"}} test3(m) ?
指針
指針: 指針是一種數(shù)據(jù)類(lèi)型,,存儲(chǔ)的是變量地址 指針類(lèi)型定義: var 指針變量名 指針類(lèi)型 = &變量 ? 可以通過(guò)指針間接修改變量的值 *指針變量 = 值 *取值運(yùn)算符 &取地址運(yùn)算符 ?
new創(chuàng)建空間
``` //聲明指針 默認(rèn)值為nil nil是一個(gè)內(nèi)存地址編號(hào)為0的空間 var p *int
//創(chuàng)建內(nèi)存空間 賦值給質(zhì)變量 //new(數(shù)據(jù)類(lèi)型) p = new(int) *p=123 ```
|