go语言中make和new的区别有哪些

发布时间:2023-01-13 16:28:55 作者:iii
来源:亿速云 阅读:168

Go语言中make和new的区别有哪些

在Go语言中,makenew是两个用于内存分配的内建函数。尽管它们都用于分配内存,但它们的使用场景和功能有很大的不同。本文将详细探讨makenew的区别,并通过代码示例来帮助理解它们的具体用法。

1. 概述

1.1 new函数

new函数用于分配内存,并返回一个指向该内存的指针。它接受一个类型作为参数,并返回该类型的零值的指针。

ptr := new(T)

其中,T是任意类型,ptr是指向T类型零值的指针。

1.2 make函数

make函数用于创建切片、映射和通道等引用类型的数据结构。它接受一个类型、长度和容量(对于切片和通道)作为参数,并返回一个初始化后的(非零值)的引用类型。

slice := make([]T, length, capacity)
map := make(map[K]V)
channel := make(chan T)

其中,T是切片或通道的元素类型,KV是映射的键和值类型。

2. new函数的详细解析

2.1 new函数的基本用法

new函数的主要作用是分配内存并返回一个指向该内存的指针。它适用于所有类型,包括基本类型、结构体、数组等。

package main

import "fmt"

func main() {
    // 分配一个int类型的零值,并返回指针
    ptr := new(int)
    fmt.Println(*ptr) // 输出: 0

    // 分配一个结构体的零值,并返回指针
    type Person struct {
        Name string
        Age  int
    }
    p := new(Person)
    fmt.Println(p) // 输出: &{ 0}
}

2.2 new函数的返回值

new函数返回的是一个指向新分配内存的指针,该内存被初始化为类型的零值。对于基本类型,零值是0false""(空字符串);对于结构体,零值是所有字段的零值。

2.3 new函数的局限性

new函数只能分配内存并返回指针,它不会对内存进行初始化(除了零值初始化)。因此,对于引用类型(如切片、映射和通道),new函数返回的指针指向的是零值,而不是一个可用的数据结构。

package main

import "fmt"

func main() {
    // 使用new分配一个切片
    slicePtr := new([]int)
    fmt.Println(slicePtr) // 输出: &[]
    fmt.Println(*slicePtr == nil) // 输出: true

    // 使用new分配一个映射
    mapPtr := new(map[string]int)
    fmt.Println(mapPtr) // 输出: &map[]
    fmt.Println(*mapPtr == nil) // 输出: true

    // 使用new分配一个通道
    chanPtr := new(chan int)
    fmt.Println(chanPtr) // 输出: &<nil>
    fmt.Println(*chanPtr == nil) // 输出: true
}

从上面的代码可以看出,new函数返回的指针指向的是零值,而不是一个可用的数据结构。因此,对于引用类型,通常使用make函数来创建可用的数据结构。

3. make函数的详细解析

3.1 make函数的基本用法

make函数用于创建切片、映射和通道等引用类型的数据结构。它接受一个类型、长度和容量(对于切片和通道)作为参数,并返回一个初始化后的(非零值)的引用类型。

package main

import "fmt"

func main() {
    // 创建一个切片
    slice := make([]int, 5, 10)
    fmt.Println(slice) // 输出: [0 0 0 0 0]

    // 创建一个映射
    m := make(map[string]int)
    m["key"] = 42
    fmt.Println(m) // 输出: map[key:42]

    // 创建一个通道
    ch := make(chan int, 1)
    ch <- 42
    fmt.Println(<-ch) // 输出: 42
}

3.2 make函数的返回值

make函数返回的是一个初始化后的引用类型,而不是指针。对于切片,make函数会分配底层数组并返回一个切片;对于映射,make函数会初始化一个空的映射;对于通道,make函数会初始化一个通道并返回。

3.3 make函数的参数

make函数的参数取决于所创建的数据结构类型:

3.4 make函数的局限性

make函数只能用于创建切片、映射和通道等引用类型的数据结构。对于其他类型(如基本类型、结构体、数组等),不能使用make函数。

package main

import "fmt"

func main() {
    // 错误:不能使用make创建int类型
    // i := make(int)

    // 错误:不能使用make创建结构体
    // type Person struct {
    //     Name string
    //     Age  int
    // }
    // p := make(Person)
}

4. newmake的区别总结

4.1 适用类型

4.2 返回值

4.3 初始化

4.4 使用场景

5. 代码示例

5.1 使用new创建结构体指针

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    // 使用new创建结构体指针
    p := new(Person)
    p.Name = "Alice"
    p.Age = 30
    fmt.Println(p) // 输出: &{Alice 30}
}

5.2 使用make创建切片

package main

import "fmt"

func main() {
    // 使用make创建切片
    slice := make([]int, 5, 10)
    fmt.Println(slice) // 输出: [0 0 0 0 0]

    // 修改切片
    slice[0] = 42
    fmt.Println(slice) // 输出: [42 0 0 0 0]
}

5.3 使用make创建映射

package main

import "fmt"

func main() {
    // 使用make创建映射
    m := make(map[string]int)
    m["key"] = 42
    fmt.Println(m) // 输出: map[key:42]
}

5.4 使用make创建通道

package main

import "fmt"

func main() {
    // 使用make创建通道
    ch := make(chan int, 1)
    ch <- 42
    fmt.Println(<-ch) // 输出: 42
}

6. 总结

newmake是Go语言中用于内存分配的两个重要函数,但它们的使用场景和功能有很大的不同。new函数适用于所有类型,返回一个指向零值的指针;而make函数仅适用于引用类型,返回一个初始化后的数据结构。理解它们的区别和适用场景,有助于在Go语言开发中更有效地使用它们。

通过本文的详细解析和代码示例,相信读者已经对newmake的区别有了更深入的理解。在实际开发中,应根据具体需求选择合适的函数来分配内存和初始化数据结构。

推荐阅读:
  1. docker用go语言的原因是什么
  2. go语言是不是面向对象的

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

go语言 make new

上一篇:Go语言切片支持多维吗

下一篇:Node项目中如何操作MySQL

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》