Li Sheng | Backend / Distributed Storage Engineer Li Sheng | Backend / Distributed Storage Engineer
Home
Resume
Projects
Topics
Notes
GitHub (opens new window)
Home
Resume
Projects
Topics
Notes
GitHub (opens new window)
  • Go语言

    • 并发编程

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

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

  • 算法题

  • 存储系统

  • CephFS

  • 分布式系统

  • 计算机网络

  • Redis与缓存

  • Kubernetes

  • 技术笔记
  • Go语言
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对堆栈分配处理是相同的,编译器优先进行逃逸分析,逃逸的才分配到堆上

Edit (opens new window)
Last Updated: 2026/04/27, 13:46:33
数组和切片的区别
go defer

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

最近更新
01
待完成专题池
04-28
02
待完成专题池
04-28
03
为什么 Kubernetes CSI 插件架构要拆成 Controller、Node 与 Sidecar
04-28
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式