变量是存储值得地方。 借助声明变量时使用的名字来区分。
指针的值是一个变量的地址。一个指针指示值所保存的位置。不是所有的值都有地址,但是所有的变量都有。使用指针,可以在无需知道变量名字的情况下,间接读取或者更新变量的值。
Go语言支持指针类型*T,指针的指针**T。
指针声明
在指针类型变量前面加上 *(取值符)来获取指针所指向的内容。
在值类型变量前面加上 &(取地址符)来获取该变量的指针。
如果一个变量声明为 var x int:
&x 获取一个指向整型变量的指针,它的类型是整形指针 *int;
如果 p := &x,那么p指向x,p执行的变量写成*p;
*p 表示获取变量的值,是一个整型,如果*p出现在赋值操作左边,则用于更新变量的值。
package main
import "fmt"
func incr(p *int) int {
*p++
fmt.Printf("value type: %T\n", *p)
return *p //p是一个整型指针,*p代表指针所指向的值
}
func main() {
v := 1
incr(&v) // &v 是1所在的地址
fmt.Println(&v) //打印2的地址,结果为 0xc420084008
fmt.Println(incr(&v)) //现在v的值为3
}
从指针获取指针指向的值
正如上面所说,x 是一个普通变量,&x 获取一个指向整型变量的指针,它的类型是整形指针 *int,在对指针使用*操作,也就是指针取值
package main
import (
"fmt"
)
func main() {
// 准备一个字符串类型
var description = "This is the pointer example 001"
// 对字符串取地址, pointer类型为*string
pointer := &description
// 打印pointer的类型
fmt.Printf("pointer type: %T\n", pointer)
// 打印pointer的指针地址
fmt.Printf("address: %p\n", pointer)
// 对指针进行取值操作
value := *pointer
// 取值后的类型
fmt.Printf("value type: %T\n", value)
// 指针取值后就是指向变量的值
fmt.Printf("value: %s\n", value)
}
运行结果如下:
pointer type: *string
address: 0xc0000101e0
value type: string
value: This is the pointer example 001
使用指针修改值
在这个例子中,我们将a指向255的地址,然后通过*a取值并加一,可以看到新值已经加1.
package main
import (
"fmt"
)
func main() {
b := 255
a := &b
fmt.Println("address of b is", a)
fmt.Println("value of b is", *a)
*a++
fmt.Println("new value of b is", b)
}
输出:
address of b is 0xc0000a2000
value of b is 255
new value of b is 256
空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。nil 指针也称为空指针。
nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。
package main
import (
"fmt"
)
func main() {
var ip *int
var sp *string
if ip == nil {
fmt.Println("ip == nil")
}
if sp == nil {
fmt.Println("sp == nil")
}
}
结果如下:
ip == nil
sp == nil
请注意:定义的不同类型的零值不能用于比较运算
浙公网安备 33010602011771号