PHPer的Go之路 -- 指针
简介
变量是一种使用方便的占位符,用于引用计算机内存地址。
变量是一种使用方便的占位符,用于引用计算机内存地址。Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。php里面似乎没有指针这个概念。但有使用&$a这种改变变量原始值的方式。
我们来看一下普通变量和 上一篇 结构体的地址:
package main
import "fmt"
type Books struct {
book_id int
title string
author string
subject string
}
func main() {
var Book1 Books /*声明 Book1 为 Books 类型*/
var str int = 5
Book1.title = "Go"
Book1.author = "臭大佬"
Book1.subject = "计算机语言"
Book1.book_id = 1
fmt.Printf("一个变量的地址: %x\n", &str )
fmt.Printf("结构体的地址: %x\n", &Book1 )
}
声明
类似于变量和常量,在使用指针前你需要声明指针。指针声明格式如下:
var name *type
type 为指针类型,name 为指针变量名,* 号用于指定变量是作为一个指针
var ip *int /* 指向整型*/
var fp *float32 /* 指向浮点型 */
使用
当指针被声明后,没有指向任何变量内存地址时,它的零值是 nil,然后我们可以通过在给定变量前加上取地址符 & 获取变量对应的内存地址将其赋值给声明的指针类型,这样,就是对指针的初始化了,然后我们可以通过在指针类型前加上间接引用符 * 获取指针指向内存空间存储的变量值。当然,我们也可以通过 := 对指针进行初始化:
package main
import "fmt"
func main() {
var a int = 20 /* 声明实际变量 */
var ip *int /* 声明指针变量 */
var n *int
pointer := &a
ip = &a /* 指针变量的存储地址 */
fmt.Printf("a 变量的地址是: %x\n", &a)
/*通过:=初始化指针*/
fmt.Printf("pointer 通过:=初始化指针: %x\n", pointer)
/* 当一个指针被定义后没有分配到任何变量时,它的值为 nil。 */
fmt.Printf("n 值: %d\n", n)
/* 指针变量的存储地址 */
fmt.Printf("ip 变量储存的指针地址: %x\n", ip)
/* 使用指针访问值 */
fmt.Printf("*ip 变量的值: %d\n", *ip)
//判断空指针
if(n == nil){
fmt.Printf("n 是空指针")
}
}
底层会自动判断指针的类型,在格式化输出时,可以通过 %x 来标识指针类型。
go中的&
和*
写在变量前的作用
&
:读取变量的指针地址值,*
:获取指针指向内存地址存储的变量值
代码
// 申明并复制变量
str := 1
// 声明指针类型
var ptr *int
// 初始化指针类型值为变量 str
ptr = &str
// 打印指针
fmt.Println(ptr)
// 打印指针变量存储的变量值
fmt.Println(*ptr)
运行结果:
λ go run test.go
0xc0000aa058
1