go语言中的new函数介绍

在 Go 语言中,new 是一个内建函数,用于分配内存并返回一个指向新分配的零值的指针。其主要作用是创建一个类型为 T 的新变量,并初始化为该类型的零值,返回指向这个变量的指针。它的语法和基本使用方法如下:

new 函数的基本语法

new(T)
  • T 是你想要创建的新变量的类型。
  • new(T) 返回的是一个类型为 *T 的指针,指向该类型的零值。

返回值

new 函数返回的是指向类型 T 零值的指针。注意,这个指针指向的内存已经被分配,并且其值被初始化为该类型的零值。

例如,new(int) 会返回一个指向零值 0*int 类型指针;new(string) 会返回一个指向零值空字符串 ""*string 类型指针。

示例

package main

import "fmt"

func main() {
	// 使用 new 创建一个 int 类型的指针,指向 0
	ptr := new(int)
	// 输出指针 ptr 所指向的值,应该是 0
	fmt.Println(*ptr) // 0
	
	// 修改 ptr 所指向的值
	*ptr = 42
	// 输出修改后的值
	fmt.Println(*ptr) // 42

	// 使用 new 创建一个 string 类型的指针,指向空字符串 ""
	strPtr := new(string)
	// 输出指针 strPtr 所指向的值,应该是 ""
	fmt.Println(*strPtr) // ""
}

newmake 的区别

在 Go 语言中,newmake 都用于分配内存,但它们有显著的区别:

  • new(T):返回一个类型为 *T 的指针,并将内存初始化为该类型的零值。
  • make(T, ...):用于创建切片(slice)、映射(map)和通道(channel)等引用类型,并初始化它们的内部结构。make 返回的是该引用类型本身,而不是指向它的指针。

示例:newmake 对比

package main

import "fmt"

func main() {
	// 使用 new 创建 int 类型指针,指向 0
	ptr := new(int)
	fmt.Println(*ptr) // 0

	// 使用 make 创建一个切片并初始化
	slice := make([]int, 5)
	fmt.Println(slice) // [0 0 0 0 0]
}

在这个例子中,new(int) 返回的是一个指向 int 类型零值的指针,而 make([]int, 5) 创建了一个包含 5 个元素的整数切片。

总结

  • new(T) 用于为类型 T 分配内存,并返回一个指向该内存区域的指针,指针指向该类型的零值。
  • new 是一个简便的内存分配工具,通常用于创建简单类型的指针。
  • newmake 都用于内存分配,但 make 主要用于初始化引用类型(如切片、映射和通道),并返回的是类型本身,而非指针。

通过 new,你可以轻松地为各种类型创建零值并获取它们的指针,这在一些场景中(如动态分配内存)非常有用。

posted @ 2025-01-22 23:34  LoftyAmbition  阅读(169)  评论(0)    收藏  举报