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