Golang 中关于变量内存分配部分

关于变量内存分配

关于函数传参中的slice

  • 以下一个slice传参的例子来说明

代码

package main

import "fmt"

func sliceDemo() {
    // 定义容量为2, 长度为1的字符串数组
    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") // 当容量已经不足以保存数据,append函数将造成变量内存重新分配
    args[0] = "2"               // 修改的变量对于原来的变量不会造成影响
}

func main() {
    sliceDemo()
}

输出

1

注意

    1. 在changMe 函数中,由于是传一个slice的变量进来,slice变量的底层结构是: {len, cap, *ptr}, 即 slice的当前长度, 容量, 指向变量的指针
    1. 由于传入的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, 应该跟你开始的设想是不同的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gogeof

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值