dongjun111111 / blog

BLOG
36 stars 5 forks source link

Golang中Slice小坑 #62

Open dongjun111111 opened 8 years ago

dongjun111111 commented 8 years ago

Golang中Slice小坑

此文灵感主要来源于知乎上一位网友的提问,达达大神回答了,个人比较赞同, 记录一下。

package main 

import "fmt" 

func main(){
         s := []int{5} 
         s = append(s,7)
         fmt.Println("cap(s) =", cap(s), "ptr(s) =", &s[0]) 
         s = append(s,9)
         fmt.Println("cap(s) =", cap(s), "ptr(s) =", &s[0]) 
         x := append(s, 11)
         fmt.Println("cap(s) =", cap(s), "ptr(s) =", &s[0], "ptr(x) =", &x[0]) 
         y := append(s, 12)
         fmt.Println("cap(s) =", cap(s), "ptr(s) =", &s[0], "ptr(y) =", &y[0]) 
}
output==>
cap(s) = 2 ptr(s) = 0x10328008 
cap(s) = 4 ptr(s) = 0x103280f0
cap(s) = 4 ptr(s) = 0x103280f0 ptr(x) = 0x103280f0 
cap(s) = 4 ptr(s) = 0x103280f0 ptr(y) = 0x103280f0

也就是说: 在slice进行append操作的时候,针对原slice的内存大小会首先进行判断,如果剩余内存足够容纳append的元素的时候,此时它不会重新分配内存,只会在原先的线性内存中写入数据,此时内存地址不变;如果原slice的剩余内存不足以放下将要写入的数据时,此时它会以乘2的方式重新申请一块新的内存来容纳数据,此时的内存地址发生了改变。这样做的目的是避免不必要的内存分配,从而提高程序的效率。