本文是看了文章之后的心得。 在此感谢。

概述

newmake

new 函数

new
func new(Type) *Type

官方文档描述为:

newnew
new
    func newInt *int {
        var i int
        return &i   //为何可以返回局部变量呢?
    }
    someInt := newInt()

这里要注意的第一点是,返回值是一个指针。
然后,为何一个golang 中的函数可以返回局部变量呢?

make 函数

make
func make(Type, size IntegerType) Type 
  • 第一个参数是一个类型,第二个参数是长度
  • 返回值是一个类型

官方描述为:

makenewmake
Slice : 第二个参数 size 指定了它的长度,此时它的容量和长度相同。
你可以传入第三个参数 来指定不同的容量值,但是必须不能比长度值小。
比如: make([]int, 0, 10)
Map: 根据size 大小来初始化分配内存,不过分配后的 map 长度为0。 如果 size 被忽略了,那么会在初始化分配内存的时候 分配一个小尺寸的内存。
Channel: 管道缓冲区依据缓冲区容量被初始化。如果容量为 0 或者被 忽略,管道是没有缓冲区的。
var p *[]int = new([]int)var v []int = make([]int, 10)

总结

newslicemapchannel
make(T, args)new(T)

问题:栈中分配的变量,出栈的时候不会被释放吗?

我们注意到有如下函数:

    func newInt *int {
        var i int
        return &i   //为何可以返回局部变量呢?
    }
    someInt := newInt()

有个回答回答的很好: golang 和 c 语言不一样,栈区分配的存储空间不会随着函数的返回而释放,本地变量地址所占据的存储空间会生存下来。

那么: 什么时候会释放呢? 什么情况下才会释放呢? (好问题,今天我一定回答了)