写代码的时候,咱们经过变量就能够操做存储在内存中的值,进行赋值、加减运算等。你们有没有想过,变量表明什么呢?其实,一个变量对应一段内存空间,这段空间就存储了该变量相对应类型的值。指针的值就对应变量的地址,只经过指针,就能够更新或者读取变量的值,而不须要用到变量名。编程
var i int = 10 //声明变量i,并初始化为10
var ptr *int = &i
fmt.Println(ptr,*ptr)
// 0xc000018060 10 指针变量ptr存储的是i地址,*ptr对应指针指向的变量的值
*ptr = 12 // i=12 更新指针指向的变量的值
fmt.Println(*ptr,i) // 12 12
复制代码
上面这段代码,声明了*int
类型的指针变量 ptr
,经过取址运算符&
得到指向整型变量 i
的地址。能够说,指针ptr
指向变量i
,或者说ptr
指针保存了变量i
的地址。函数
经过上面一段话的解释,相信你们对指针有了比较清晰的认识:指针指向一个变量的内存地址。要想使用指针,必须先声明,格式以下:学习
var var_name *var_type
// var_name 指针名称,var_type 指针所指向的变量的类型
复制代码
var i int = 10
str := "go"
var ip *int // *int类型的指针
var pstr *string // *string类型的指针
ip = &i
pstr = &str
fmt.Println(*ip,*pstr) // 10 go
复制代码
注意:*int
类型的指针,说明该指针指向的必定是int
类型的变量,*string
类型也相似。测试
str := "go"
var ip *int
ip = &str // 编译不会经过
复制代码
*int
类型的指针,指向的变量如果string
类型的,编译器编译的时候就会报错:ui
cannot use &str (type *string) as type *int in assignment
复制代码
文章写到这里,关于如何使用指针,其实上文已经列出来了,主要通过三个步骤:声明、赋值和访问指针指向的变量的值spa
x,y := 1,"go"
var px *int = &x // 一、声明并初始化
var py = &y // 二、省略指针类型,编译器自动判断
//px,py := &x,&y // 三、使用 :=
fmt.Println(*px,*py) // 1 go 访问
复制代码
一个指针已声明而没有赋值时,称为空指针,为 nil
。任何类型的指针的零值都是 nil
。.net
var ip *int
fmt.Println(ip) // nil
fmt.Printf("ip 的值为:%x", ip) // ip 的值为:0
复制代码
若是ip != nil
为真,那么p是指向某个有效变量。指针之间也是能够进行相等测试的,只有当它们指向同一个变量或所有是nil
时才相等。指针
1、指向同一个变量 true
x,_ := 1,1
px,py := &x,&x
fmt.Println(px == py)
2、指向不一样变量 false
x,y := 1,1
px,py := &x,&y
fmt.Println(px == py)
3、两个nil指针 true
var px *int
var py *int
fmt.Println(px == py)
复制代码
指针包含的是一个变量的地址,若是将一个指针做为参数传递给函数,就能够经过指针来更新变量的值。code
func a(p *int){
*p++
}
i := 10
fmt.Println(i) // 10
a(&i);
fmt.Println(i) // 11
复制代码
给你们介绍下new
函数,内建的new
函数也是一种建立变量的方法,new(type)
表示建立一个type
类型的匿名变量,并初始化为type
类型的零值,返回变量的地址,指针类型为*type
。cdn
p := new(int) // p, *int 类型, 指向匿名的 int 变量
fmt.Println(*p) // 0
*p = 2 // 设置 int 匿名变量的值为 2
fmt.Println(*p) // 2
复制代码
用new
函数建立变量和普通变量声明语句方式建立变量没有什么区别,除了不须要声明一个临时变量的名字外。 下面的两个函数有着相同的行为:建立变量,并返回变量地址
func newA() *int {
return new(int)
}
func newB() *int {
var i int
return &i
}
复制代码
每次调用new
函数都会返回新的变量的地址:
p := new(int)
q := new(int)
fmt.Println(p,q) // 0xc000018060 0xc000018068
复制代码
new
函数使用的比较少,不过以为挺有意思的,就在这给你们分享下!实际编程,多的仍是使用具体类型建立变量,毕竟更方便,是吧!
原创文章,若需转载请注明出处!
欢迎扫码关注公众号「Golang来啦」或者移步 seekload.net ,查看更多精彩文章。
公众号「Golang来啦」给你准备了一份神秘学习大礼包,后台回复【电子书】领取!