golang中指针,new和make函数作用(代码片段)

LeoHan LeoHan     2022-12-06     518

关键词:

我们知道golang中的传递都是基于值传递,如果一个结构体比较大,这时候值传递需要复制的内容就比较多同时由于是基于值复制,耗费空间和时间,另外,基于值传递我们在调用的函数中对传入的参数进行修改,对于原值是没有任何影响的,也就是我们无法在函数中对传入的参数的原值进行修改
因此golang中提供了指针,和c、c++中的指针的概念类似,这时候传递的是指针,也是值复制,但是复制的是指针(指针比较小),这样我们既能够快速的将参数传递过去,同事也能够对原值进行修改。

需要注意的是,golang中存在另种内存模块,即我们常说的堆和栈,函数一般在栈上运行,局部变量在栈上分配,当函数结束之后,函数栈被回收,但是golang运行时会判断如果这个局部变量在函数结束之后还有其他区域引用,则会在栈上分配:

func testHeap() *model.JobInfo
	jobInfo := model.JobInfo
	return &jobInfo

这段代码如果在C中是会出问题的,因为C中函数结束之后,除非是显示调用maclloc在堆上分配空间,在栈上分配的都会被回收,返回的地址空间内容将不可知。
但是在golang中是可以运行的,因为golang运行时会自动判断外部是否还需要引用,如果需要引用这个的话,那么这个变量就不会在栈上分配,而是在堆上分配,golang的垃圾回收的作用区间也是在堆上。

指针是一种数据类型,其存储的是一个内存地址,该地址指向一个实际的内存单元

golang中声明指针一般如下:
var ptrName *prtType

var strPtr *string

这样我们就声明了一个类型为*string的指针,这时候strPtr的内容实际上是nil,而对指针变量赋值需要用到&取地址运算符:

	var strPtr *string
	str := "hello world"
	strPtr = &str
	fmt.Println(*strPtr)

而如果我们要获取指针对应的实际内容,需要用到取内容运算符*:

    // 打印 0xc000038790
    fmt.Println(strPtr)
    // 打印 hello world
	fmt.Println(*strPtr)

可以看到,打印指针变量的值对应的是一个地址,而取改地址的内容则是实际的值。

指针是可以有多个结合的,指向指针的指针:

	intVal := 10
	var intPtr *int
	var intPtrPtr **int
	intPtr = &intVal
	intPtrPtr = &intPtr
	fmt.Println("intPtrPtr = ",intPtrPtr)
	fmt.Println("*intPtrPtr = ",*intPtrPtr)
	fmt.Println("intPtr = ",intPtr)
	fmt.Println("**intPtrPtr = ",**intPtrPtr)
	fmt.Println("*intPtr = ",*intPtr)

打印如下:

intPtrPtr =  0xc0000d8020
*intPtrPtr =  0xc0000ac970
intPtr =  0xc0000ac970
**intPtrPtr =  10
*intPtr =  10

还可以更多的指针结合:

var intPtrPtr ***int

指向数组的指针:

var ptrArr [3]*int

指向结构体的指针

指向结构体的指针我们可以使用两种方式来进行初始化,一种是使用&取地址运算符,另外一种是使用new运算符:

	var jobPtr *model.JobInfo
	jobInfo := model.JobInfo
	jobPtr = &jobInfo
	jobPtr = new(model.JobInfo)
	jobPtr.Id = 12345

一般我们通过new和make来创建指针,一般而言

  • new 函数只用于分配内存,并且将内存清零(c、c++不会清零),返回一个对应类型的零值的指针
  • make只用于slice、chan、map这三种内置类型的创建和初始化

golang内置函数new()

...它的返回值是一个指向新分配的t类型的零值的指针。在golang的代码定义如下:funcnew(tType)*Typestrut{} 直接使用struct{}来初始化strut时,返回的是一个struct类型的值,而不是指针两者是不一样的 golang的new和make主要区别 查看详情

go语言之go语言make和new(代码片段)

...个参数是一个类型,并且返回一个指向该类型内存地址的指针。同时new函数会把分配的内存置为零,也就是类型的零值。new函数,它返回的永远是类型的指针,指针指向分配类型的内存地址。makemake也是用于内存分配的,但是和n... 查看详情

go语言中new与make的使用和区别(代码片段)

...个参数,此参数是一个类型,分配指向该类型内存地址的指针,同时将该内存的数据置为0;也就说new不能new引用类型,new的返回值指向引用的指针,并把引用置为0,也就是new的返回值是指向另一个空引用的指针。无效1i:=new(int)2... 查看详情

go语言make和new关键字的区别(代码片段)

...个参数是一个类型,并且返回一个指向该类型内存地址的指针。同时new函数会把分配的内存置为零,也就是类型的零值。    makemake也是用于内存分配的,但是和new不同,它只用于chan、map以及slice的内存创建,而且它返回的... 查看详情

go中new()与make()区别(代码片段)

...参数,参数为类型,它的返回值是一个指向新分配类型的指针,并且内存置为零。packagemainimport"fmt"funcmain() test1:=new(int)//创建int类型的指针,用来存储int类型变量的地址 varaint=2 test1=&a fmt.Printf("%d",*test1) test2:=new(string)//创建strin... 查看详情

go语言中内建函数new和make的区别(代码片段)

Golang中有两个负责内存分配的内建函数:new和make.二者有明显区别.new:new函数用于初始化一个对象,并返回该对象的首地址,可以用于初始化任何类型make:make函数返回一个初始化的实例,只能用于初始化map,slice,channel三种类型1packagemain23... 查看详情

golang中的内置函数(代码片段)

??Go中存在着不少内置函数,此类函数并不需要引入相关Package就可以直接使用该类函数。在Go的源码builtin包的builtin.go中定义Go所有的内置函数;但该文件仅仅是定义描述出了所有内置函数,并不包含函数的任何实现代码,该文件... 查看详情

new&makeingo_code(代码片段)

...意的第一点是,返回值是一个指针。 然后,为何一个golang中的函数可以返回局部变量呢?make函数make 也是内建函数,你可以从 ht 查看详情

golang|new和make方法的区别(代码片段)

首先我们要知道new和make都是用来创建分配类型的内容,但是使用方法不一样。new首先我们用一个例子来看new的使用场景variintvarssring我们通过var关键字声明两个变量,当我们不指定变量的值的时候,变量默认是类型的... 查看详情

go语言中new()和make()的区别(代码片段)

...后会自动释放。引用类型:slice,map,chan和值类型对应的指针变量存储的是一个地址(或者理解为指针),指针指向内存中真正存储数据的首地址。内存通常在堆上分配,通过GC回收。 2.new()vs make()对值类型和引用类型了... 查看详情

golangbasic_leaming指针(代码片段)

阅读目录一、关于指针二、指针地址和指针类型三、指针取值四、指针传值示例五、new和make1、new函数分配内存2、make函数分配内存3、new与make的区别一、关于指针通过前面的教程我们知道变量是用来存储数据的,变量的本质... 查看详情

golangbasic_leaming指针(代码片段)

阅读目录一、关于指针二、指针地址和指针类型三、指针取值四、指针传值示例五、new和make1、new函数分配内存2、make函数分配内存3、new与make的区别一、关于指针通过前面的教程我们知道变量是用来存储数据的,变量的本质... 查看详情

go语言中new和make的区别详解

...类型,不是一个值,返回值是一个指向新分配类型零值的指针实现一个类似new的功能:funcnewInt()*intvariintreturn&isomeInt:=newInt()函数的功能跟someInt:=new(int)一模一样。定义new开头的函数时,出于约定也应该返回类型的指针。2、make的... 查看详情

go中make和new有什么区别(代码片段)

   本文主要给大家介绍了Go语言中函数new与make的使用和区别,关于Go语言中new和make是内建的两个函数,主要用来创建分配类型内存。在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单... 查看详情

go中make和new有什么区别(代码片段)

   本文主要给大家介绍了Go语言中函数new与make的使用和区别,关于Go语言中new和make是内建的两个函数,主要用来创建分配类型内存。在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单... 查看详情

我可以用 make 或 new 在 golang 中制作一个预填充的字符串吗?

】我可以用make或new在golang中制作一个预填充的字符串吗?【英文标题】:CanImakeaprefilledstringingolangwithmakeornew?【发布时间】:2018-08-3119:18:23【问题描述】:我正在尝试在Go中优化我的stringpad库。到目前为止,我发现用已知字符值... 查看详情

go语言基础函数,数组,指针,结构体(代码片段)

...量作用域数组数组定义数组+函数+宏定义二维数组指针make和new的区别二级指针的使用空指针指针数组将指针传入函数进行值的交换结构体自定义类型和类型别名结构体初始化匿名结构体结构体的内存布局结构体内存对齐各... 查看详情

golangmake和new的区别及实现原理详解(代码片段)

...对类型进行内存创建和初始化,其返回值是所创建类型的指针引用,这是与make函数的区别之一。我们通过一个示例代码看下:funcmain()vara*intfmt.Println(a)//nil*a=123//panicfmt.Println(a)通过上面代码可以看出,当我们通过var声明一个变量... 查看详情