LiSheng's blog LiSheng's blog
首页
笔记
个人简历
随笔集
GitHub (opens new window)
首页
笔记
个人简历
随笔集
GitHub (opens new window)
  • golang

    • 并发编程

      • GMP并发模型
      • 锁相关
      • groutine并发相关
      • go如何实现原子操作
    • 内存管理

    • 数组和切片的区别
    • new和make
      • new
      • make
    • go defer
    • context
    • channel
    • go map
    • interface
    • 对象系统
    • rune 类型
    • 字符串拼接的几种方式
  • cplus

  • leetcode

  • 存储技术

  • 分布式系统

  • 计算机网络

  • Linux操作系统

  • Redis

  • 其他

  • 笔记
  • golang
lisheng
2024-09-10
目录

new和make

new 和 make 是 Go 语言中创建数据结构的两种方式,但它们的用途和工作方式有很大不同。以下是两者的主要区别:

# new

用途:new 是用于创建某个类型的零值指针。它分配内存并返回一个指向该类型的新分配内存的指针。 适用类型:任何类型,包括基本类型、结构体、数组、切片、映射等。 返回值:返回的是一个指向该类型的指针。 示例:

package main  

import "fmt"  

func main() {  
    // 使用 new 创建一个int类型的零值指针  
    p := new(int)  
    fmt.Println(*p) // 输出:0(整数的零值)  
    
    // 将其值修改为42  
    *p = 42  
    fmt.Println(*p) // 输出:42  
}  
1
2
3
4
5
6
7
8
9
10
11
12
13

在这个示例中,new(int) 创建了一个指向 int 类型的指针,并且它的初始值为零值(0)。

# make

用途:make 是用于初始化切片、映射和通道,这些类型的零值是 nil,不能直接使用。make 不返回指针,而是返回一个初始化好的值。 适用类型:只适用于切片、映射和通道。 返回值:返回的是初始化好的值,而不是指向该值的指针。

总结 使用 new 创建任意类型的指针,并返回一个指向该类型的零值指针。 使用 make 初始化切片、映射和通道,并返回一个已初始化的(非 nil)值。 对于使用哪一个,简单可以记住:

使用 new 时,关注指针和原始值的分配。 使用 make 时,关注初始化和使用特定的数据结构。

make与new对堆栈分配处理是相同的,编译器优先进行逃逸分析,逃逸的才分配到堆上

编辑 (opens new window)
上次更新: 2024/09/13, 11:59:12
数组和切片的区别
go defer

← 数组和切片的区别 go defer→

最近更新
01
ceph分布式存储-对象存储(RGW)搭建
10-27
02
ceph分布式存储-集群客户端连接
10-27
03
ceph分布式存储-管理crushmap
10-27
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式