golang 指针

Golang 指针

指针就是一个变量,用于存储另一个变量的内存地址。这个内存地址往往是在内存中存储的另一个变量的值的起始位置。

指针特点

  • 默认值是nil,没有NULL常量
  • 操作符”&”用于获取变量地址,”*” 通过指针目标对象
  • 不支持指针运算

实例
声明一个变量x 并且设置值为1, 声明变量p 值为x的地址

1
2
3
4
5
6
7
8
9
10
11
12
13

package main

import "fmt"


func main(){
x := 1
p := &x //&获取x的地址
fmt.Println(p) //打印地址
fmt.Println(x,*p) //*p获取x所对应的值

}

以上输出结果为

1
1 1

通过指针修改变量的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

package main

import "fmt"


func main(){
x := 1
p := &x //&获取x的地址
fmt.Println(x,*p) //*p获取x所对应的值

*p = 3 //修改变量的值

fmt.Println(x,*p)

}

输出结果为

1
3 3   //*p指向x 修改*p等于修改x

指针作用函数参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

package main

import "fmt"


func incr(p,b *int) {
*p++
*b=*b+30
}


func main(){
x := 1
c :=2
p := &x //&获取x的地址
fmt.Println(x,*p) //*p获取x所对应的值

*p = 3 //修改变量的值

fmt.Println(x,*p)


//将x地址传递给incr函数,然后返回变量修改
incr(&x,&c)
fmt.Println(x,c)

}

输出结果为

1
2
3
1 1
3 3
4 32

new和make

在golang中,make和new都是分配内存的,但是它们之间还是有些区别的,只有理解了它们之间的不同,才能在合适的场合使用。

简单来说 new只是分配内存,不初始化内存,而make即分配又初始化内存。所谓的初始化就是给类型赋初值,比如字符为空,整型为0, 逻辑值为false等。

备注

  1. make 仅用来分配及初始化类型为 slice、map、chan 的数据。new 可分配任意类型的数据.
  2. new 分配返回的是指针,即类型 *Type。make 返回引用,即 Type.
  3. new 分配的空间被清零, make 分配空间后,会进行初始化.

new返回的是一个指针

1
2
3
name := new(string)
server := new(string)
fmt.Println(name,server) //输出0xc0000421f0 0xc000042200