Golang new and make

庆云2年前技术文章909

Go  语言中 new 方法和 make 方法,都是用于分配相应类型内存空间。

1、make

make 内置函数分配并初始化(仅)slice、map 或 chan 类型的对象,返回值是所创建的类型本身。与 new 不同,make 的返回类型是所创建的类型本身,而不是指向它的指针。

函数签名:

func make(t Type, size ...IntegerType) Type


应用示例:

package main

import "fmt"

func main() {
	s := make([]string, 3, 5)
	m := make(map[int]string, 5)
	c := make(chan int, 5)

	fmt.Println(s, m, c) // [  ] map[] 0x1400012e000
}

2、new

new 内置函数可以对类型进行内存创建和初始化,返回的值是指向该类型新分配的零值的指针。


函数签名:

func new(Type) *Type

应用示例:

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

func main() {
	p := new(Person)
    // p := Person{}
	p.Name, p.Age = "Tom", 18

	fmt.Println(p) // &{Tom 18}
}


注意:new  内建函数在代码中比较少见,因为 new 内建函数可以被取代。

3、make 和 new 的区别

本质上 make 函数初始化时,会初始化 slice、chan、map 类型的内部数据结构,new 函数并不会。make  函数合理的 len、cap 还可以提高效率和减少开销。make 和 new 函数还有以下区别:

  • make 函数

    • 能够创建类型所需的内存空间,返回引用类型的本身。

    • 具有使用范围的局限性,仅支持 channel、map、slice 三种类型。

    • 具有独特的优势,make 函数会对三种类型的内部数据结构(长度、容量等)赋值。

  • new 函数

    • 能够创建并分配类型所需的内存空间,返回指针引用(指向内存的指针)。

    • 可被替代,能够通过字面值快速初始化。


相关文章

oracle自带存储过程的压测使用

1、使用前提条件:A、timed_statistics参数为true B、sysdba权限 C、11g及以上版本 D、ASYNCH_IO开启通过运行以下查询,确保为数据文件启用异步 I/OCOL NA...

PostgreSQL 会话管理

说明当数据库发生持续的 CPU 使用率打高时,数据库中很可能正在跑一些大查询或者较复杂的 SQL,如果不及时处理很可能会影响到业务,此时我们需要通过查询会话找到 “罪魁祸首” 并 kill 掉它,然后...

GitLab 变量的介绍与使用

环境变量是一个动态命名的值,它可以影响正在运行的进程在操作系统上的行为方式。一、环境变量分类在 GitLab CI/CD 中,环境变量分为两部分:预定义环境变量自定义环境变量1.1 预定义环境变量Gi...

开启kerberos配置HiveServer2负载均衡

开启kerberos配置HiveServer2负载均衡

1.HAProxy配置HiveServer2负载均衡1.编辑/etc/haproxy/haproxy.cfg文件,在文件末尾增加如下配置listen stats     bind 0.0.0.0:1...

python脚本--检查域名证书到期时间

需要的依赖:pip install python-dateutil pip install pytzpython脚本内容:#!/usr/bin/env python3      import s...

Flume使用案例之Flume与Flume之间数据传递,多Flume汇总数据到单Flume

目标:flume11监控文件hive.log,flume-22监控某一个端口的数据流,flume11与flume-22将数据发送给flume-33,flume33将最终数据写入到HDFS。分步实现:1...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。