免费资源网 – https://freexyz.cn/

目录
  • 相同点
  • 不同点
    • 1.传递的参数不一样
    • 2.返回的参数类型不一样
    • 3.使用场景不一样
  • 总结

    相同点

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

    不同点

    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(T):适用于任何类型的内存分配,包括但不限于结构体、数组、指针等。它会为指定的类型 T 分配内存,并将内存初始化为其零值,然后返回指向该内存区域的指针(类型为 *T)。
    • make(T, args…):仅适用于三个内建的引用类型,即切片(slice)、映射(map)和通道(channel)。对于这三种类型,make 不仅仅是分配内存,还会执行额外的初始化操作,如设置内部数据结构、哈希表大小以及 channel 缓冲区等。make 函数的返回值直接是初始化后的 slice/map/channel 类型,而不是指针。

    使用方式和返回值:

    • new() 的调用形式相对简单:p := new(Type),返回的是一个指向新分配内存的指针。
    • make() 的调用需要提供额外参数以初始化相应的类型,例如创建切片时需要长度和可选的容量:s := make([]int, length, capacity);创建 map 或 channel 时无需指定大小,但可以对通道指定缓冲区大小。

    初始化内容:

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

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

    • 对于切片,会创建底层数组并设置长度和容量;
    • 对于映射,会初始化一个空的哈希表;
    • 对于通道,会创建一个通信的数据结构,并可选择性地分配缓冲区。

    免费资源网 – https://freexyz.cn/

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。