关于变量内存分配
关于函数传参中的slice
代码
package main
import "fmt"
func sliceDemo() {
array := make ([]string , 1 , 2 )
array[0 ] = "0"
changeMe(array)
for _, v := range array {
fmt.Println(v)
}
}
func changeMe(args []string ) {
args = append (args, "2345" )
args[0 ] = "1"
args = append (args, "2345" )
args[0 ] = "2"
}
func main() {
sliceDemo()
}
输出
1
注意
在changMe 函数中,由于是传一个slice的变量进来,slice变量的底层结构是: {len, cap, *ptr}, 即 slice的当前长度, 容量, 指向变量的指针
由于传入的ptr,地址跟原来变量相同,所以,在changMe中的第一步append时array变量的容量还够,不会造成内存重新分配,赋值会修改到原来的变量;第二步调用 append函数时, append会造成变量重新分配内存(array 的容量只有2),从而之后的修改,对于原来的变量将不会再有影响
使用new初始化map
源码
package main
import "fmt"
func mapDemo() {
abc := new (map [string ]string )
(*abc)["hello" ] = "world"
fmt.Println((*abc)["hello" ])
}
func main(){
mapDemo()
}
输出
panic : assignment to entry in nil map
goroutine 1 [running]:
main.mapDemo ()
/Users/gogeof/PycharmProjects/src/github.com /gogeof/learn/main.go :7 +0x63
main.main ()
/Users/gogeof/PycharmProjects/src/github.com /gogeof/learn/main.go :12 +0x20
exit status 2
注意
使用new分配内存时,会自动赋空值,并且返回的是一个指针。 在这里, 使用new将返回一个指向 map[string]string 的指针,但是这个指针的变量值为 nil(指针的默认值)。 这个变量不能直接操作。也就是说,使用new创建一个 map, 应该跟你开始的设想是不同的。