详解golang中make与new的异同点和用法

 更新时间:2024年01月18日 09:45:42   作者:莫忘初心丶  
这篇文章将给大家介绍了go语言中函数new与make的使用和区别,关于go语言中new和make是内建的两个函数,主要用来创建分配类型内存,文中通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下

make介绍

在Go语言中,make 是一个用于创建切片、映射(map)和通道(channel)等引用类型的内置函数。make 的主要作用是为这些引用类型分配内存并进行初始化。

用法:

1. 创建切片(slice):

slice := make([]int, 5) // 创建一个包含5个整数的切片

make 接受两个参数,第一个是类型,第二个是长度。对于切片,还可以提供一个可选的容量参数:

slice := make([]int, 5, 10) // 创建一个长度为5,容量为10的切片

2. 创建映射(map):

myMap := make(map[string]int) // 创建一个字符串到整数的映射

3. 创建通道(channel):

ch := make(chan int) // 创建一个整数类型的通道

注意事项:

  1. make 只能用于引用类型的数据结构,不能用于值类型(例如结构体)的创建。
  2. make 返回被初始化的引用类型实例,而不是指针。
  3. 对于切片和映射,make 除了分配内存,还会初始化内部的数据结构,确保它们可以被直接使用。
  4. 对于通道,make 会创建并返回一个未被缓冲的通道。

总体而言,make 主要用于创建引用类型并进行初始化,以确保它们可以被正确地使用。

new介绍

在Go语言中,new 是一个用于为值类型分配内存并返回指向新分配的零值实例的指针的内置函数。new 主要用于创建值类型的实例,例如结构体。以下是 new 的基本用法和注意事项:

用法:

1. 创建值类型实例:

ptr := new(int) // 创建一个整数类型的指针,指向新分配的零值整数

2. 创建结构体实例:

type MyStruct struct {
    Field1 int
    Field2 string
}

instance := new(MyStruct) // 创建一个 MyStruct 类型的指针,指向新分配的零值结构体

注意事项:

  1. new 返回一个指向新分配内存的零值实例的指针。
  2. 对于值类型,new 分配的内存会被初始化为零值。
  3. new 接受一个参数,即要分配内存的类型,并返回一个指向该类型的零值的指针。
  4. new 不适用于引用类型(如切片、映射和通道),只能用于值类型的创建。
  5. new 分配的内存不会被清理,需要程序员负责释放。

总体而言,new 主要用于为值类型分配内存,并返回一个指向新分配的零值实例的指针。在实际使用时,根据需要选择使用 new 还是直接声明和初始化。

make与new的异同

make 和 new 都是用于在Go语言中进行内存分配的内置函数,但它们的用途和行为有一些关键的区别。

相同点:

  • 内存分配: 两者都用于在堆上分配内存。

不同点:

1. 适用类型:

  • make make: 只用于slicemap以及channel的初始化。
slice := make([]int, 5)
  • new 用于创建值类型的实例,例如结构体。返回一个指向新分配的零值实例的指针。
ptr := new(int)

2. 返回类型:

  • make 返回被初始化的引用类型实例,而不是指针。

  • new 返回一个指向新分配的零值实例的指针。

3. 参数:

  • make 接受类型和长度等参数,用于初始化引用类型的内部数据结构。
slice := make([]int, 5)
  • new 只接受类型参数,返回一个指向该类型的零值的指针。
ptr := new(int)

4. 初始化:

  • make 除了分配内存,还会初始化引用类型的内部数据结构。

  • new 分配的内存会被初始化为零值。

总结:

  • 使用 make 主要用于初始化引用类型,确保它们可以被直接使用。
  • 使用 new 主要用于为值类型分配内存,返回一个指向新分配的零值实例的指针。

选择使用 make 还是 new 取决于您要创建的数据结构的类型和初始化需求。

以上就是详解golang中make与new的异同点和用法的详细内容,更多关于golang make与new异同和用法的资料请关注脚本之家其它相关文章!

相关文章

  • Go使用chan或context退出协程示例详解

    Go使用chan或context退出协程示例详解

    这篇文章主要为大家介绍了Go使用chan或context退出协程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Golang实现优雅的将struct转换为map

    Golang实现优雅的将struct转换为map

    在项目实践中,有时候我们需要将struct结构体转为map映射表,然后基于map做数据裁剪或操作。那么下面我来介绍下常用的两种转换方式,希望对大家有所帮助
    2023-01-01
  • go time.After优化后性能提升34%内存减少67%

    go time.After优化后性能提升34%内存减少67%

    这篇文章主要介绍了go语言time.After优化后性能提升34%内存减少67%实例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • gorm golang 并发连接数据库报错的解决方法

    gorm golang 并发连接数据库报错的解决方法

    今天小编就为大家分享一篇gorm golang 并发连接数据库报错的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • golang 获取当前执行程序路径的操作

    golang 获取当前执行程序路径的操作

    这篇文章主要介绍了golang 获取当前程序执行路径的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言中的方法定义用法分析

    Go语言中的方法定义用法分析

    这篇文章主要介绍了Go语言中的方法定义用法,实例分析了方法的定义及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • 解决go echo后端处理跨域的两种操作方式

    解决go echo后端处理跨域的两种操作方式

    这篇文章主要介绍了解决go echo后端处理跨域的两种操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang Http请求返回结果处理

    Golang Http请求返回结果处理

    本文主要介绍了Golang Http请求返回结果处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Golang连接池的几种实现案例小结

    Golang连接池的几种实现案例小结

    这篇文章主要介绍了Golang连接池的几种实现案例小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Golang开发中常用的代码片段汇总

    Golang开发中常用的代码片段汇总

    这篇文章主要给大家汇总了在Golang开发中常用的代码片段,这些代码片段都是在日常工作中编写golang应用时使用到,需要的朋友可以参考借鉴,下面跟着小编一起来学习学习吧。
    2017-07-07

最新评论