Go语言make和new的区别

作者: MojoTech | 来源:发表于2019-08-29 16:04 被阅读16次
golang_make_new_coverage.png

Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,
咋一看很相似.不过解释两者之间的不同也非常容易. 他们所做的事情,和应用的类型也不相同. 二者都是用来分配空间.

Go语言中new和make是内建的两个函数,主要用来创建分配类型内存.
在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用.

1. new

new(T) 为一个 T 类型新值分配空间并将此空间初始化为 T 的零值,返回的是新值的地址,也就是 T 类型的指针 *T,该指针指向 T 的新分配的零值.

new要点

  • 内置函数 new 分配空间.
  • 传递给new 函数的是一个类型,不是一个值.
  • 返回值是 指向这个新分配的零值的指针.

2. make

make(T, args) 返回的是初始化之后的 T 类型的值,这个新值并不是 T 类型的零值,也不是指针 *T,是经过初始化之后的 T 的引用.
make 也是内建函数,你可以从 http://golang.org/pkg/builtin/#make 看到它,
它的函数原型 比 new 多了一个(长度)参数,返回值也不同.

make 只能用于 slice,map,channel 三种类型,
并且只能是这三种对象. 和 new 一样,第一个参数是 类型,不是一个值.
但是make 的返回值就是这个类型(即使一个引用类型),而不是指针.具体的返回值,依赖具体传入的类型.

3. 总结

  • new(T) 返回 T 的指针 *T 并指向 T 的零值.
  • make(T) 返回的初始化的 T,只能用于 slice,map,channel,要获得一个显式的指针,使用new进行分配,或者显式地使用一个变量的地址.
  • new 函数分配内存,make函数初始化;

new和make区别代码:

package main

import "fmt"

func main() {
    p := new([]int) //p == nil; with len and cap 0
    fmt.Println(p)

    v := make([]int, 10, 50) // v is initialed with len 10, cap 50
    fmt.Println(v)

    /*********Output****************
        &[]
        [0 0 0 0 0 0 0 0 0 0]
    *********************************/

    (*p)[0] = 18        // panic: runtime error: index out of range
                        // because p is a nil pointer, with len and cap 0
    v[1] = 18           // ok
    
}

相关文章

  • Go语言中new和make的区别

    转载自Go语言中new和make的区别 Go语言中new和make是内建的两个函数,主要用来创建分配类型内存。在我...

  • Golang中make与new有何区别?

    Golang中make与new有何区别? 一、前言 本文主要给大家介绍了Go语言中函数new与make的使用和区别...

  • Go语言make和new的区别

    Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似.不过解释两者之间的不同也非常容易...

  • Go学习总结笔记(一)

    go version 1.13 基础语法 1. new(T) 和 make(T,args) 的区别? new(T)...

  • go 语言中 new和make的区别

    new(T) :为每个新的类型T分配一片内存,初始化为 0 并且返回类型为*T的内存地址:这种方法 返回一个指向类...

  • Go语言中new和make的区别

    Go语言中new和make是内建的两个函数,主要用来创建分配类型内存。在我们定义生成变量的时候,可能会觉得有点迷惑...

  • 2018-12-02

    go new和make区别 new用来分配内存,但与其他语言中的同名函数不同,它不会初始化内存,只会讲内存置零;也...

  • go语言视频讲解机会

    本文是的go语言系列视频的目录 go语言中的make和new(https://www.bilibili.com/v...

  • go的new和make创建引用类型的问题

    go的引用类型包含 slice、map、channel 内置函数new和make创建引用类型的区别:new:会根据...

  • Go make 和 new 的区别

    new(T) 返回的是 T 的指针 new(T) 为一个 T 类型新值分配空间并将此空间初始化为 T 的零值,返回...

网友评论

    本文标题:Go语言make和new的区别

    本文链接:https://www.haomeiwen.com/subject/bavbectx.html