Go语言中make和new的区别及说明

2025-07-03 17:50
文章标签 语言 go 说明 区别 make new

本文主要是介绍Go语言中make和new的区别及说明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教...

1 概述

在Go语言中,new和make是两GmGiWBTI个用于创建对象的内建函数,主要用于go语言数据结构的初始化。

2 new 函数

2.1 功能

new 函数用于创建一个指定类型的指针,并将其初始化为零值。它返回指向新分配的内存地址的指针。

2.2 语法

new 函数的语法非常简单,只需在关键字 new 后面跟上类型即可。

func new(Type) *Type

2.3 初始化案例

package main
 ​
 import "fmt"
 ​
 type Person phpstruct {
     Name string
     Age  int
 }
 ​
 func main() {
     p := new(Person)
     fmt.Println(p)
 }

在上述代码中,使用 new 函数创建了一个指向 Person 类型的指针 p,并输出其值。运行结果为 &{ 0},表明 p 是一个指向 Person 类型零值的指针。

3 make 函数

3.1 功能

make 函数用于创建内建类型(如切片、映射和通道)的对象,它返回一个已初始化的(非零值)对象。

3.2 语法

make 函数的语法与 new 函数有所不同,它需要指定类型和一些额外的参数。

func make(Type, size IntegerType) Type

3.3 初始化案例

package main
 ​
 import "fmt"
 ​
 func main() {
     // 创建一个长度为5,容量为10的整型切片
     s := make([]int, 5, 10)
     fmt.Println(s)
      
     // 创建一个键为string,值为int的映射
     m := make(map[string]int)
     m["a"] = 1
     m["b"] = 2
     fmt.Println(m)
      
     // 创建一个字符串通道
     c := make(chan string)
     fmt.Println(c)
 }

在上述代码中,使用 make 函数创建了一个长度为 5,容量为 10 的整型切片 s,一个键为 string,值为 int 的映射 m,并创建了一个字符串通道 c。运行结果分别为 [0 0 0 0 0],map[a:1 b:2] 和 0xc0000460c0,表明这些对象都被初始化为非零值。

4 区别

4.1 分配的类型

  • new 函数用于任何类型的分配,并返回一个指向该类型的指针。
  • make 函数只用于分配切片、映射和通道,并返回初始化后的切片、映射或通道对象。

4.2 返回值类型http://www.chinasem.cn

  • new 函数返回指向分配类型的指针。
  • make 返回分配类型的初始化后的非零值。

4.3 使用场景

4.3.1 new函数

new 函数主要用于创建值类型的实例。值类型包括基本类型(如整型、浮点型、布尔型等)以及结构体。new 函数返回一个指向新分配内存的指针,可以方便地对该实例进行操作和修改。

package main
 ​
 import "fChina编程mt"
 ​
 type Point struct {
     X, Y int
 }
 ​
 func main() {
     p := new(Point)
     p.X = 10
     p.Y = 20
     fmt.Println(p) // 输出:&{10 20}
 }

4.3.2 make 函数

make 函数主要用于创建引用类型的对象。引用类型包括切片(slice)、映射(map)和通道(chan)。由于引用类型需要在使用之前进行初始化,make 函数返回的是初始化后的非零值对象,而不是指针。

 package main
 ​
 import "fmt"
 ​
 func main() {
     // 创建一个长度为5,容量为10的整型切片
     s := make([]int, 5, 10)
     fmt.Println(s) // 输出:[0 0 0 0 0]
      
     // 创建一个键为string,值为int的映射
     m := make(map[string]int)
     m["a"] = 1
     m["b"] = 2
     fmt.Println(m) // 输出:map[a:1 b:2]
      
     // 创建一个字符串通道
     c := make(chan string)
     fmt.Println(c) // 输出:0xc0000460c0
 }

4.3.3 代码对比

package main
 import "fmt"
 ​
 type Person struct {
     Name string
     Age int
 }
 ​
 func main() {
     // 使用new创建Person类型的指针
     p1 := new(Person)
     p1.Name = "Alice"
     p1.Age = 25
     fmt.Println(p1) // 输出:&{Alice 25}
     // 使用make创建切片
     s1 := make([]int,编程 5, 10)
     s1[0] = 1
     s1[1] = 2
     fmt.Println(s1) // 输出:[1 2 0 0 0]
 }

从示例代码可以看出,使用 new 创建的是指针类型,而使用 make 创建的是初始化后的非零值对象。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持China编程(www.chinasem.cn)。

这篇关于Go语言中make和new的区别及说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155292

相关文章

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

MySQL中VARCHAR和TEXT的区别小结

《MySQL中VARCHAR和TEXT的区别小结》MySQL中VARCHAR和TEXT用于存储字符串,VARCHAR可变长度存储在行内,适合短文本;TEXT存储在溢出页,适合大文本,下面就来具体的了解... 目录一、VARCHAR 和 TEXT 基本介绍1. VARCHAR2. TEXT二、VARCHAR

Python sys模块的使用及说明

《Pythonsys模块的使用及说明》Pythonsys模块是核心工具,用于解释器交互与运行时控制,涵盖命令行参数处理、路径修改、强制退出、I/O重定向、系统信息获取等功能,适用于脚本开发与调试,需... 目录python sys 模块详解常用功能与代码示例获取命令行参数修改模块搜索路径强制退出程序标准输入

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求: