GO语言make和new关键字的区别

 更新时间:2023年04月12日 08:49:26   作者:富士康质检员张全蛋  
本篇文章来介绍一道非常常见的面试题,到底有多常见呢?可能很多面试的开场白就是由此开始的。那就是 new 和 make 这两个内置函数的区别,希望对大家有所帮助
  • make使用场景 slice map channel
  • new 使用场景 大部分使用在结构体当中

1. new 和 make

执行报错

执行下面的代码会引发 panic,为什么呢?

  • 在 Go 语言中对于引用类型的变量,我们在使用的时候不仅要声明它,还要为它分配内存空间,否则我们的值就没办法存储。
  • 而对于值类型的声明不需要分配内存空间,是因为它们在声明的时候已经默认分配好了内存空间。
  • 要分配内存,就引出来今天的 new 和 make。Go 语言中 new 和 make 是内建的两个函数,主要用来分配内存。
func main() {
var userinfo map[string]string
    userinfo["username"] = "张三"
    fmt.Println(userinfo)
}
/*
panic: assignment to entry in nil map
*/

2. make和new比较

new 和 make 是两个内置函数,主要用来创建并分配类型的内存。

make和new区别

  • make 关键字的作用是创建 slice、map 和 channel 等内置的数据结构
  • new 的作用是为类型申请一片内存空间,并返回指向这片内存的指针(申请空间和返回指针)
func main() {
a := make([]int, 1, 10) // 切片长度为 1,预留空间长度为 10
a = append(a,1)
fmt.Printf("%v--%T \n",a,a) // [0 0 0]--[]int 值----切片本身
var b = new([]int)
//b = b.append(b,2) // 返回的是内存指针,所以不能直接 append
*b = append(*b, 3) // 必须通过 * 指针取值,才能进行 append 添加
fmt.Printf("%v--%T",b,b) // &[]--*[]string 内存的指针---内存指针
}

3. new函数

系统默认的数据类型,分配空间

// 1.new实例化int
age := new(int)
*age = 1
// 2.new实例化切片
li := new([]int)
*li = append(*li, 1)
// 3.实例化map
userinfo := new(map[string]string)
*userinfo = map[string]string{}
(*userinfo)["username"] = "张三"
fmt.Println(userinfo) // &map[username:张三]
}

自定义类型使用 new 函数来分配空间

func main() {
var s *Student
s = new(Student) //分配空间
s.name ="zhangsan"
fmt.Println(s) // &{zhangsan 0}
}
type Student struct {
name string
age int
}

4. make函数

  • make 也是用于内存分配的,但是和 new 不同,它只用于 chan、map 以及 slice 的内存创建而且它返回的类型就是这三个类型本身,而不是他们的指针类型。
  • 因为这三种类型就是引用类型,所以就没有必要返回他们的指针了
package main
import "fmt"
func main() {
a := make([]int,1,10) // 切片长度为 1,预留空间长度为 10
b := make(map[string]string)
c := make(chan int, 1)
fmt.Println(a,b,c) // [0 0 0] map[] 0xc0000180e0
}

当我们为slice分配内存的时候,应当尽量预估到slice可能的最大长度,通过给make传第三个参数的方式来给slice预留好内存空间,这样可以避免二次分配内存带来的开销,大大提高程序的性能。

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

相关文章

  • Go 函数返回nil遇到问题避坑分析

    Go 函数返回nil遇到问题避坑分析

    这篇文章主要为大家介绍了Go 函数返回nil遇到的避坑问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • GO语言协程互斥锁Mutex和读写锁RWMutex用法实例详解

    GO语言协程互斥锁Mutex和读写锁RWMutex用法实例详解

    这篇文章主要介绍了GO语言协程互斥锁Mutex和读写锁RWMutex用法详解,需要的朋友可以参考下
    2022-04-04
  • GO语言实现简单TCP服务的方法

    GO语言实现简单TCP服务的方法

    这篇文章主要介绍了GO语言实现简单TCP服务的方法,实例分析了Go语言实现TCP服务的技巧,需要的朋友可以参考下
    2015-03-03
  • Go Build编译打包文件的完整步骤

    Go Build编译打包文件的完整步骤

    go build命令是用于编译Go语言程序并生成可执行文件,它可以将Go源代码编译成机器代码,并将其打包成可执行文件,方便在不同的操作系统上运行,这篇文章主要给大家介绍了关于Go Build编译打包文件的完整步骤,需要的朋友可以参考下
    2024-02-02
  • 使用Go语言实现发送微信群消息

    使用Go语言实现发送微信群消息

    这篇文章主要为大家详细介绍了如何使用Go语言实现发送微信群消息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • glow工具在命令行读取Markdown好物分享

    glow工具在命令行读取Markdown好物分享

    这篇文章主要为大家介绍了一款实用的命令行工具glow,这个CLI工具可以在命令行读取Markdown,这对于码农来说非常友好,使用起来也非常舒爽
    2022-07-07
  • Golang中的Slice与数组及区别详解

    Golang中的Slice与数组及区别详解

    数组是一种具有固定长度的基本数据结构,在golang中与C语言一样数组一旦创建了它的长度就不允许改变,数组的空余位置用0填补,不允许数组越界。今天小编通过实例代码操作给大家详细介绍lang中的Slice与数组的相关知识,一起看看吧
    2020-02-02
  • Golang实现Redis事务深入探究

    Golang实现Redis事务深入探究

    这篇文章主要介绍了Golang实现Redis事务深入探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 安装Sublime Text支持Go插件的方法步骤

    安装Sublime Text支持Go插件的方法步骤

    本文主要介绍了安装Sublime Text支持Go插件的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 详解Go 结构体格式化输出

    详解Go 结构体格式化输出

    这篇文章主要介绍了Go 结构体格式化输出的相关资料,帮助大家更好的理解和学习go语言,感兴趣的朋友可以了解下
    2020-08-08

最新评论