我有一个数组和一个指向它的切片,如下所示:
package main
import "fmt"
func main() {
array_str := []string{"0a","1b","2c","3d","4e"}
slice_str:=array_str[1:4]
fmt.Println("Initially :")
fmt.Println("Printing 1 :Array :",array_str)
fmt.Println("Printing 1 :Slice:",slice_str)
//Step 1.Changing Slice and it get reflected in array
fmt.Println("\nAfter Alteration:")
slice_str[0]="alterd_1b"
fmt.Println("Printing 2 :Array :",array_str)
fmt.Println("Printing 2 :Slice:",slice_str)
fmt.Println("len of slice_str:",len(slice_str)," cap of slice_str:",cap(slice_str),"len of array_str:",len(array_str))
//Step 2.appending to slice and it get reflected
slice_str = append(slice_str,"apnded_elemnt")
fmt.Println("\nAfter Apending:")
fmt.Println("Printing 3 :Array :",array_str)//"4e" is replaced with "apnded_elemnt" in array !!
fmt.Println("Printing 3 :Slice:",slice_str)
fmt.Println("len of slice_str:",len(slice_str)," cap of slice_str:",cap(slice_str),"len of array_str:",len(array_str))
//Step 3.Again appending to slice so that lentght of slice is growing further to underlaying array
slice_str = append(slice_str,"outgrown_elemnt")
fmt.Println("\nAfter OUT GROWING:")
fmt.Println("Printing 4 :Array :",array_str)//obeviously out grown elemnt not added to array that is fine
fmt.Println("Printing 4 :Slice:",slice_str)
fmt.Println("len of slice_str:",len(slice_str)," cap of slice_str:",cap(slice_str),"len of array_str:",len(array_str))
//How Capacity Become 8 here ???
//Step 4 .Now Changing Slice element which is in Range of array to verify it reflect on array:
fmt.Println("\nAfter Post out grown Alteration:")
slice_str[0]="again_alterd_1b"
fmt.Println("Printing 2 :Array :",array_str)//Change in slice is not reflectd in array .Why ?
fmt.Println("Printing 2 :Slice:",slice_str)
}
Run Code Online (Sandbox Code Playgroud)
游乐场:http://play.golang.org/p/3z52HXHQ7s
问题:
在第3步中,为什么cap切片从4跳到8?
在第4步中:超出切片的范围后,对切片元素的更改(不在数组范围内)不会反映到数组,反之亦然。它长大后为什么没有发生?当切片长大时实际发生什么?
看到这里:http : //blog.golang.org/slices
简短的答案:1)它通过加倍(简短)而增长。如果追加一次,则也可能会第二次追加,这样可以避免分配。2)这就是切片生长的工作方式。数组无法增长,因此将分配一个新的更大的数组,复制旧的数组,然后您将得到一个指向更大副本的切片。
(golang.org网站上的文档确实很有帮助,可读,简短,准确。我建议您先问一下golang.org,然后再问这里。)
| 归档时间: |
|
| 查看次数: |
518 次 |
| 最近记录: |