golang make()的第三個參數
學習了一段時間golang,大概可以用golang做一些小東西了,於是回顧了一下一些基礎的東西。golang分配記憶體有一個make函數,該函數第一個參數是類型,第二個參數是分配的空間,第三個參數是預留分配空間,前兩個參數都很好理解,但我對第三個參數卻一臉懵逼,例如a:=make([]int, 5, 10), len(a)輸出結果是5,cap(a)輸出結果是10,然後我對a[4]進行賦值發現是可以得,但對a[5]進行賦值發現報錯了,於是鬱悶這個預留分配的空間要怎麼使用呢,於是google了一下發現原來預留的空間需要重新切片才可以使用,於是做一下記錄,代碼如下。
packagemain
import"fmt"
funcmain(){
a :=make([]int,10,20)
fmt.Printf("%d, %d\n",len(a),cap(a))
fmt.Println(a)
b := a[:cap(a)]
fmt.Println(b)
}
輸出結果
10,20
[0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
for迴圈中的值傳遞的問題解析
問題描述:
遍曆一個數組,修改其中的值:
package main
import (
"fmt"
)
type Link struct {
a int
}
func main() {
arr := make([]Link, 10)
for i, v := range arr {
v.a = i
}
for _, v := range arr {
fmt.Println(v.a)
}
}
期待輸出,數組中所有的 v.a均被修改成i中的值
實際輸出,數組中所有的v.a均未發生改變
問題分析
在Go的for…range迴圈中,Go始終使用值拷貝的方式代替被遍曆的元素本身,簡單來說,就是for…range中那個value,是一個重複使用的值拷貝,而不是元素本身。不能通過&(地址)進行修改某個屬性。
解決方案:直接調用數組
package main
import (
"fmt"
)
type Link struct {
a int
}
func main() {
arr := make([]Link, 10)
for i, _ := range arr {
arr[i].a = i
}
for _, v := range arr {
fmt.Println(v.a)
}
}