Go指针、new()与make()方法区别 |Go主题月

1. 指针类型

Golang的指针相比c与c++的指针简单,只是通过指针查找元素,不涉及指针的运算。

go指针两个基本用法:

(1)&取地址

(2)*根据地址取值

n1 := 20
n2 := &n1 //n2获得n1的地址,n2是一个int类型指针
n3 := *n2 //n3获得n2指针所对应的值
复制代码

取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。

变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:

  • 对变量进行取地址(&)操作,可以获得这个变量的指针变量。
  • 指针变量的值是指针地址。
  • 对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。

这里都和c/c++一样不重复描述了。

2. new方法与make方法的异同

在Go中,对于引用类型,例如指针,切片等,在声明后,必须要为它们分配内存,否则对于指针或者切片类型的变量就没有办法给它们赋值,这个时候指针与切片里保存的就是空值,即nil。而值类型,如int ,String等,在声明时就默认分配好了内存。

package  main
import "fmt"
 
func main(){
	var a *int
	fmt.Println(a == nil)

	var slice []int
	fmt.Println(slice == nil)
}
复制代码

输出结果:

true
true
复制代码

所以需要用new和make来为它们分配内存,new与make都是Go语言中用来分配内存的内置函数。

2.1 new()

(1) 基本用法

func new(T)   //返回一个*T 
复制代码

T:表示类型,new函数接受该类型作为参数,然后返回一个指向该类型的指针

例如:

package  main
import "fmt"
 
func main(){
	var a = new(int) //a是一个int型指针
	*a = 20
	fmt.Printf("a的类型是:%T\n%v\n",a,*a)
}
复制代码

输出结果:

a的类型是:*int
20
复制代码

(2)Go中new与c++中new的区别

Go中new()与c++中new不同的点在:它并不初始化内存,只是将其置零。

a = new(T)会给a分配被置零的存储,并且返回它的地址,一个类型为*T的值。

2.2 make()

(1) 基本用法

make也是用于内存分配,区别于new,make用于slice、map以及chan的内存创建(这些都是Go独有的数据类型,都是引用类型,所以没有必要返回他们的指针),并且返回一个初始化的(而不是零值),类型为T的值(而不是*T的值)。

//make( []T,  size,  cap )
//创建一个长度为6,容量为10的整形切片
a1 := make([]int, 6, 10) 

hash := make(map[int]bool,10)

ch := make(chan int,5)
复制代码
  • T: 切片中元素类型
  • size : 切片访问元素的个数(即长度),通过len(a1)获得
  • cap : 切片允许增长到的元素个数(即容量),通过cap(a1)获得
  • cap值可以省略,当cap省略时,默认与size值相等,即 a2 := make([]int ,5) ,则size = 5,cap = 5。

2.3 new(),make()的主要区别

  • make()是用来初始化slice、map、chan的;
  • new()是根据传入的类型分配一片内存空间,并返回指向这片空间的指针
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享