PHPer的Go之路 -- 指针

臭大佬 2019-11-21 00:00:37 2090
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