初始化基本一樣,不同點需要注意,make使用,nil變數的訪問
初始化:
57 //修改元素值函式,指標版本和副本版本,指標版會修改原值
58 func modify(arr [3]int, i int, v int)
62 63 func main() //預設初始化為0
66 v2 := [...]int{} //根據初始化列表決定元素個數,元素個數為0
67 v3 := [3]int //指定索引初始化
68
69 fmt.println(v, v1, v2, v3)
70 }
初始化:
71 //切片函式引數版本
72 func modify(arr int, i int, v int)
75 76 func main() //v != nil,nil切片和0長度切片行為一致,函式會等同對待
82 v1 := int
83 84 var arr [3]int
85 v2 := arr[:]
86 v3 := arr[2:]
87 88 v3 = v1
89 modify(v3, 0, 111)
90 v2 = nil
91 92 v4 := make(int, 3, 6) //若不指定cap,則和len一致
93 94 //v5 := make(int, 4)
95 //v5 = v4[4:] //panic:slice bounds out of range,v4超過了len()
96 v4 = push(v4, 123)
97 v4 = push(v4, 123)
98 v4 = push(v4, 123)
99 v4 = push(v4, 123)
100
101 fmt.println(v == nil, vv == nil, v0 == nil, v1, v2 == nil, v3, cap(v4), len(v4), v4)
102
103 }
陣列可以用==進行比較,切片編譯錯誤
45 func push(s int, v int) int else
53 54 tmp_s[len(s)] = v
55 56 return tmp_s
57 }
copy函式,按照src,dst最小長度進行底層陣列資料拷貝
105 v5 := make(int, 2, 6)
76 func push_s(s int, v ...int) int
slice記憶體技巧:
不用分配新空間,在原slice上修改
清理0資料
84 func removeinvalid2(s int) int
91 }
92 93 return s[:i]
94 }
95 96 func removeinvalid(s int) int
102 }
103
104 return s_tmp
105 }
107 func removeindex(s int, i int) int
111 copy(s[i:], s[i+1:])
112 return s[:len(s)-1]
113 }
114
115 func reverse(s int) int
119 for i := range s
123 s[i], s[len(s)-i-1] = s[len(s)-i-1], s[i]
124 }
125 return s
126 }
我們也看到了slice作為函式引數的使用,同樣map也是會作為引用來使用的,使用時要注意slice和map內部變化,防止得不到想要的結果,所以我一般會在函式返回後進行賦值
128 func insert(m map[int]string, i int, s string) map[int]string
132
133 func main()
136 delete(m1, 5)
137
138 m2 := make(map[int]string)
139 m3 := map[int]string{}
140 m3 = insert(m3, 2, "aaaaaaa")
141
142 m4 := make(map[int]map[string]bool)
143 fmt.println(m == nil, m1, m2, m3, m4)
144 }
注意:key必須是可比較的型別,如字串,陣列(可比較的字段),結構體(可比較的字段)
slice不能比較,但可以轉換成字串再儲存為key
149 type point struct
152
158
159 type line struct
163 func main() , },
176 cnt: 2,
177 }}
178 */
179
180 var pt point
181 pt.x = 1
182 pt.y = 2
183
184 pt1 := point //這種初始化方式不推薦,建議用下方
185 pt2 := point
186
187 l := line{}
188
189 var l1 line
190 //l1 := line{}
191
194 fmt.println(pt, pt1, pt2, l, l1)
195 }
結構方法使用
153 //func (p *point) distance(target *point) float64
197 pt.distance(&pt1)
198 fmt.println(pt, pt1)
改變函式呼叫方型別,試試結果的不同
go會根據呼叫方型別隱式轉換,所以197行可以正確執行
資料結構整理
常見資料結構 陣列 一對一 棧佇列 鍊錶樹 一對多 圖 多對多 堆雜湊 資料結構是指相互之間存在著一種或多種關係的資料元素的集合和該集合中資料元素之間的關係組成 常用的資料結構有 陣列,棧,鍊錶,佇列,樹,圖,堆,雜湊表等,一.陣列 優點 1 按照索引查詢元素速度快 2 按照索引遍歷陣列方便 缺點 ...
go 資料結構 遞迴
1.1 遞迴的應用場景 迷宮回溯問題 1.2 遞迴概念 遞迴就是函式 方法自己呼叫自己,每次呼叫時傳入不同的變數,遞迴有助於程式設計者解決複雜的問題,同時讓 變得簡單。1.3 遞迴快速入門 1 列印問題 2 階乘問題 1.4 遞迴解決問題 1 各種數學問題 n皇后問題 漢諾塔 階乘問題 迷宮問題等 ...
整理 資料結構 堆
一 堆的定義 堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。最大堆和最小堆的例子 堆常用來實現優先佇列,在這種佇列中,待刪除的元素...