Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go make new区别

浅析Golang中make和new的用法区别

作者:梦_鱼

在Go语言中,有两个比较雷同的内置函数,分别是new和make方法,二者都可以用来分配内存,那他们有什么区别呢?下面就跟随小编一起来学习一下吧

相同点

都是内建函数,都是在堆上分配内存,都需要传递类型参数

不同点

1.传递的参数不一样

new函数只接收一个参数,make函数可以接收一个以上的参数

package main

import "fmt"

func main() {
	// int类型0值的指针,返回的值是以0x开头的16进制整数,参数个数为1
	intZeroValuePoint := new(int)
	fmt.Printf("%v\n", intZeroValuePoint)

	// 为slice分配内存, 创建初始值问 [0 0 0 0 0] 的切片,参数个数为3,第三个参数是可选的
	intHasInitLenSlice := make([]int, 5, 10)
	fmt.Printf("%v\n", intHasInitLenSlice)
}

2.返回的参数类型不一样

new函数返回对应输入参数类型的指针类型,make函数返回输入参数类型

package main

import "fmt"

func main() {
	// int类型0值的指针,返回的值是以0x开头的16进制整数
	intZeroValuePoint := new(int)
	fmt.Printf("%T\n", intZeroValuePoint)		// 输出 *int

	// 为slice分配内存, 创建初始值问 [0 0 0 0 0] 的切片
	intHasInitLenSlice := make([]int, 5, 10)
	fmt.Printf("%T\n", intHasInitLenSlice)		// 输出 []int
}

3.使用场景不一样

new函数为类型分配类型对应零值内存并返回指针,make是为特定引用类型slice map chan 分配内存

package main

import "fmt"

func main() {
	// int类型0值的指针,返回的值是以0x开头的16进制整数
	intZeroValuePoint := new(int)
	fmt.Printf("%T\n", intZeroValuePoint) // 输出 *int

	// 为slice零值分配内存,返回的值是以0x开头的16进制整数
	sliceZeroValuePoint := new([]int)
	fmt.Printf("%T: %v\n", sliceZeroValuePoint, sliceZeroValuePoint) // 输出 *[]int &[]

	// 为slice分配内存, 创建初始值问 [0 0 0 0 0] 的切片
	intHasInitLenSlice := make([]int, 5, 10)
	fmt.Printf("%T\n", intHasInitLenSlice) // 输出 []int

	// 为map分配内存
	mapValue := make(map[string]string, 10)
	fmt.Printf("%T\n", mapValue) // 输出 map[string]string

	// 为chan类型分配内存
	chanValue := make(chan int, 10)
	fmt.Printf("%T\n", chanValue)
}

总结

下面小编为大家总结了一下new和make函数的异同点,希望对大家有所帮助

相同点

不同点

用途和适用类型:

使用方式和返回值:

初始化内容:

new() 只做最基本的内存分配并填充零值。

make() 初始化的内容更复杂,例如:

到此这篇关于浅析Golang中make和new的用法区别的文章就介绍到这了,更多相关Go make new区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文