广告
返回顶部
首页 > 资讯 > 数据库 >go语言中的new与make有什么区别
  • 706
分享到

go语言中的new与make有什么区别

2024-04-02 19:04:59 706人浏览 独家记忆
摘要

本篇内容主要讲解“Go语言中的new与make有什么区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言中的new与make有什么区别”吧!new() 和

本篇内容主要讲解“Go语言中的new与make有什么区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言中的new与make有什么区别”吧!

new() 和 make() 的区别

以下摘录自 https://GitHub.com/unknwon/the-way-to-go_ZH_CN/blob/master/eBook/07.2.md

二者都在堆上分配内存,但是它们的行为不同,适用于不同的类型。

new(T) 为每个新的类型T分配一片内存,初始化为 0 并且返回类型为*T的内存地址:这种方法返回一个指向类型为 T,值为 0 的地址的指针,它适用于值类型如数组和结构体;它相当于&T{}。make(T)返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片、map 和 channel

换言之,new 函数分配内存,make 函数初始化;下图给出了区别:

我的理解,new返回一个变量的指针,但是这个指针指向空,你不可以直接对该指针进行操作,否则会报错,除非你将该指针指向一个该类型变量的地址。
make返回一个该类型的变量,以切片变量为例,上面提到,make适用于创建切片、map和channel,但new也可以创建

package mainimport "fmt"func main() {//使用make创建切片,返回的是变量本身s1 := make([]int,5,10)fmt.Printf("use make create slise type %T value %v \n",s1,s1)s1[0] = 123s1[4] = 321fmt.Printf("make s1 type %T value %v \n",s1,s1)//# 使用new 创建切片,返回的是切片变量的指针s2 := new([]int)fmt.Printf("use new create slise type %T value %v \n",s2,s2)fmt.Printf("new s2 type %T value %v \n",*s2,*s2)// 想要赋值的话需要使用*解引用// 这里虽然不报语法错误,但是如果尝试直接使用(*s2)[0] = 123的话会有运行时错误,// panic: runtime error: index out of ranges2 = &s1 //需要将变量指针指向一个该类型变量的地址(*s2)[0] = 123(*s2)[4] = 3211fmt.Printf("new s2 type %T value %v \n",s2,s2)//s2的修改也会影响s1fmt.Printf("s1 type %T value %v \n",s1,s1)m1 := make(map[string]string)m1["name"] = "yangyanxing"m1["age"] = "30"fmt.Printf("m1 use make create type:%T value %v \n",m1,m1)m2 := new(map[string]string)fmt.Printf("m2 use new create type:%T value %v \n",m2,m2)//直接赋值会报 panic: assignment to entry in nil mapm2 = &m1(*m2)["name"] = "fan"//对m2的修改也会影响到m1fmt.Printf("after m2 change m1 value is %v",m1)}

输出结果为

use make create slise type []int value [0 0 0 0 0]make s1 type []int value [123 0 0 0 321]use new create slise type *[]int value &[]new s2 type []int value []new s2 type *[]int value &[123 0 0 0 3211]s1 type []int value [123 0 0 0 3211]m1 use make create type:map[string]string value map[name:yangyanxing age:30]m2 use new create type:*map[string]string value &map[]after m2 change m1 value is map[name:fan age:30]

map的初始化

map有以下两种初始化方法

    使用make函数

    直接使用map初始化

    package mainimport "fmt"func main() {//使用make初始化mapmp2 := make(map[string]string)mp2["name"]  = "yangyanxing"mp2["age"] = "18"fmt.Println("m2 address ",&mp2)// out:m2 address  &map[name:yangyanxing age:18]mp3 := map[string]int{} //这里要有{},花括号里如果没有内容则说明初始化了一个空字典mp3["yang"] = 18mp3["fan"] = 20fmt.Println(mp3)//out:map[yang:18 fan:20]mp4 := map[string]int{"yang":20,"fan":21, //即使是最后一个也要有逗号}fmt.Println(mp4)//out:map[yang:20 fan:21]mp5 := map[string]int{"yang":30} //写在同一行则不用加逗号fmt.Println(mp5)//out: map[yang:30]mp6 := make(map[string]int,1) //还可以给map加一个容量mp6["yang"] = 30fmt.Println("mp6 lens is ",len(mp6),"address:",&mp6)//out:mp6 lens is  1 address: &map[yang:30]mp6["fan"] = 31fmt.Println("mp6 lens is ",len(mp6),"address:",&mp6)//out:mp6 lens is  2 address: &map[yang:30 fan:31]//也可以使用new,但是不可以直接对其进行赋值,因为此时它返回的是一个空指针//需要指向一个该类型的变量地址以后才可以进行操作mp7 := new(map[string]int)fmt.Println(mp7)//out:&map[]//(*mp7)["yang"] = 100 //会报运行时错误mp7 = &mp6//mp7["fan"] = 1000 //也不可以直接使用mp7,需要使用* 先解引用(*mp7)["yang"] = 100 //这时就不会报运行时错误fmt.Println(mp7)//out:&map[yang:100 fan:31]}

    slice切片的初始化

    同样可以通过make和切片本身进行初始化

    package mainimport "fmt"func main() {//使用make初始化切片,需要传一个len长度,容量cap为可选//如果不传的话则长度和容量相同sls1 := make([]int,5,10)sls1[0] = 100//append 追加到尾部,这里有点意思sls1  = append(sls1,200)// ... 三个点,go里的语法糖,展开前面的切片sls1 = append(sls1,[]int{30,40}...)fmt.Println(sls1,len(sls1),cap(sls1))//out: [100 0 0 0 0 200 30 40] 8 10sls1 = append(sls1,3,4,6)//超过切片原有容量以后将会发生扩容fmt.Println(sls1,len(sls1),cap(sls1))//out: [100 0 0 0 0 200 30 40 3 4 6] 11 20sls2 := make([]int,3)sls2[1] = 123fmt.Println(sls2,len(sls2),cap(sls2))//out: [0 123 0] 3 3//直接初始化sls3 := []int{}sls3 = append(sls3,10,20)fmt.Println(sls3,len(sls3),cap(sls3))//out: [10 20] 2 2sls4 := []int{1,2,3}sls5 :=[]int{1,2,5,//这里的逗号不能省}fmt.Println(sls4,sls5)//out: [1 2 3] [1 2 5]//使用new创建切片,和map一样,返回的也是指针,不能直接对其进行操作//需要先指向一个变量的地址sls6 := new([]int)fmt.Println(sls6)//out: &[]sls6 = &sls4fmt.Println(sls6) //out: &[1 2 3]}

    array数组的初始化

    数组不能使用make初始化,但是可以使用new初始化

    package mainimport "fmt"type person struct {name stringage int}func main() {fmt.Println("数组的初始化")//声明并初始化一个空数组,里面的元素值为类型的零值arr1 := [2]int{}fmt.Println(arr1) //out: [0 0]//初始化时将元素值写上arr2 := [2]int{1,3}fmt.Println(arr2) //out: [1 3]//只写一个,不写的是零值arr3 := [2]int{1}fmt.Println(arr3) //out: [1 0]//arr4 := make([2]int) //数组不能使用makevar arr5 [2]intarr5[0] = 100fmt.Println(arr5)//[100 0]//不指定数组大小,使用... 三点号让其自动展开计算arr6 := [...]int{2,4,6,8}fmt.Println(arr6,len(arr6))//out: [2 4 6 8] 4//使用new创建一个数组,得到的是一个指针arr7 := new([3]int)fmt.Println(arr7)//out: &[0 0 0]//可以直接对指针进行操作arr7[0] = 3//和使用*解引用作用一样(*arr7)[1] = 4fmt.Println(arr7) //out: &[3 4 0]}

    struct结构体的初始化

    结构体不能使用make,需要使用new和结构体本身

    package mainimport "fmt"type person struct {name stringage int}func main() {fmt.Println("结构体的初始化")//使用new,返回结构体指针stru1 := new(person)fmt.Println(stru1)//out &{ 0} ,默认是字段的零值//可以直接使用这个指针来操作变量//和使用*解引用效果一样stru1.name = "yangyanxing"(*stru1).age = 18fmt.Println(stru1,*stru1) //&{yangyanxing 18} {yangyanxing 18}//只指定一个字段,没有指定的默认零值stru2 := person{name:"fan"}fmt.Println(stru2) //{fan 0}//全部指定,字段的顺序可以不按照定义时的顺序stru3 := person{age:18,name:"yang"}fmt.Println(stru3) //{yang 18}//按照结构体顺序初始化,这时元素的值必须都写全了stru4 := person{"fan",17}fmt.Println(stru4) //{fan 17}}

到此,相信大家对“go语言中的new与make有什么区别”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

您可能感兴趣的文档:

--结束END--

本文标题: go语言中的new与make有什么区别

本文链接: https://www.lsjlt.com/news/59583.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • go语言中的new与make有什么区别
    本篇内容主要讲解“go语言中的new与make有什么区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言中的new与make有什么区别”吧!new() 和...
    99+
    2022-10-18
  • Go语言中make和new有什么区别
    这篇文章主要介绍“Go语言中make和new有什么区别”,在日常操作中,相信很多人在Go语言中make和new有什么区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言中make和new有什么区别”的疑...
    99+
    2023-07-05
  • go语言中make和new的区别有哪些
    这篇文章主要介绍“go语言中make和new的区别有哪些”,在日常操作中,相信很多人在go语言中make和new的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言中make和new的区别有哪些...
    99+
    2023-07-04
  • GO语言make和new关键字有什么区别
    今天小编给大家分享一下GO语言make和new关键字有什么区别的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. new 和...
    99+
    2023-07-06
  • 详解Go语言中make和new的区别
    目录写在前面实现原理makenew总结参考写在前面 虽然 make 和 new  都是能够用于初始化数据结构,但是它们两者能够初始化...
    99+
    2023-02-26
    Go语言make new区别 Go语言make new Go make new
  • Go语言中make和new函数的用法与区别
    相同点: make和new都是用来创建分配类型内存的。 不同点: 先看下面的代码 package main import "fmt" func main(){ var i *in...
    99+
    2022-11-13
  • Go语言中new和make关键字的区别是什么
    这篇文章主要介绍了Go语言中new和make关键字的区别是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中new和make关键字的区别是什么文章都会有所收获,下面我们一起来看看吧。newnew 是一...
    99+
    2023-07-05
  • GO语言make和new关键字的区别
    目录1. new 和 make2. make和new比较3. new函数4. make函数make使用场景 slice map channelnew 使用场景 大部分使用在结构体当中...
    99+
    2023-05-15
    Go语言 new make关键词区别 Go语言 new make关键词 Go语言 new make
  • Go语言中new和make关键字有哪些区别
    本篇内容介绍了“Go语言中new和make关键字有哪些区别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!newnew 是一个内置函数,它会分...
    99+
    2023-07-05
  • golang中new与make的区别讲解
    目录new和makenew使用new初始化零值new(struct)和&struct{}区别小结make使用示例总结:new和make new // The new buil...
    99+
    2023-01-12
    golang中new与make的区别 golang中new与make golang new go make
  • 浅谈Golang的new与make区别是什么
    目录newmake小结:区别:在go语言中,make和new都是内存的分配(堆上),但是make只用于slice、map以及channel的初始化(非零值);而new用于类型的内存分...
    99+
    2022-11-13
  • Go语言的make和new实现原理是什么
    这篇文章主要介绍“Go语言的make和new实现原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言的make和new实现原理是什么”文章能帮助大家解决问题。概述虽然 make...
    99+
    2023-07-05
  • go语言与gojs有什么区别
    go语言与gojs区别:1、Go语言的设计目标是提供一种简单、高效且安全的编程语言,而GoJS的设计目标是提供一个功能强大的图形化库,用于创建交互式的图形和数据可视化;2、Go语言的语法类似于C语言,而GoJS是一个基于JavaScript...
    99+
    2023-08-03
  • Go语言中make和new函数怎么使用
    这篇文章主要讲解了“Go语言中make和new函数怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中make和new函数怎么使用”吧!相同点:make和new都是用来创建分配类...
    99+
    2023-07-02
  • r语言与go语言有啥区别
    r语言与go语言区别有:1、R语言是一种专门用于统计分析和数据可视化的语言,Go语言是一种面向并发的编程语言;2、在适用领域上,R语言主要用于数据分析和统计建模,Go语言主要用于构建网络服务和分布式系统;3、在编程风格上,R语言更接近脚本语...
    99+
    2023-07-13
  • c语言与go语言的区别有哪些
    小编给大家分享一下c语言与go语言的区别有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!区别:1、C语言源文件的扩展名是“.h”和“.c”,Go语言源文件的扩展名是“.go”。2、C语言中通过文件来管理代码,Go语言中...
    99+
    2023-06-06
  • python和go语言的区别有什么
    本篇文章为大家展示了python和go语言的区别有什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。go语言Go(又称 Golang)是 Google 的 Robert Griesemer,Rob ...
    99+
    2023-06-15
  • python和go语言有什么区别
    这篇文章给大家介绍python和go语言有什么区别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对代码格式的要求没有那么严...
    99+
    2023-06-14
  • Go与PHP的语法有什么区别
    这篇文章给大家分享的是有关Go与PHP的语法有什么区别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概述Go 是由 Google 设计的一门静态类型的编译型语言。它有点类似于 C,但是它包含了更多的优点,比如垃圾...
    99+
    2023-06-15
  • go语言中协程与线程的区别是什么
    区别:1、一个线程可以多个协程,一个进程也可以单独拥有多个协程;2、线程是同步机制,而协程则是异步;3、协程能保留上一次调用时的状态,线程不行;4、线程是抢占式,协程是非抢占式的;5、线程是被分割的CPU资源,协程是组织好的代码流程,协程需...
    99+
    2023-05-14
    Golang go语言 协程 线程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作