关于变量内存分配
关于函数传参中的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, 应该跟你开始的设想是不同的。