第8节 Go中的指针

193 阅读2分钟

1. 基本介绍

  • 第6节 Go的数据类型 中我们介绍过基本数据类型,变量中存在的就是值,所以被称为值类型
func main() {
    var a  = 64
    fmt.Printf("a的值为: %v, a的类型为: %T\n", a, a)
}         
  • 如何获取一个变量的内存地址?使用 & 号来获取
package main

import "fmt"

func main() {
    var a int = 43
    // a变量的内存地址=0xc0000b0008
    fmt.Printf("a变量的内存地址=%v\n",&a)
}
  • 基本数据类型在内存空间的布局是什么样的?

掘金-第 8 页.drawio.png

2. 什么是指针

指针类型:指针变量存的是一个地址,这个地址指向的内存空间才是。这点和 Java引用类型是一个道理。

2.1 指针类型的声明

var a int = 32
// 声明指针变量
var p *int
// 指针变量赋值
p = &a

掘金-第 8 页.drawio (1).png

2.2 获取指针变量指向的具体值

语法: * 指针变量名

package main

import "fmt"

func main() {
    var a int = 43
    // 声明指针变量
    var p *int
    // 赋值
    p = &a
    // 指针p=0xc000132008,指针的值=43
    fmt.Printf("指针p=%v,指针的值=%v\n",p, *p)
}
  • 修改指针的值
func main() {
    var a int = 43
    // 声明指针变量
    var p *int
    // 赋值
    p = &a
    // 指针p=0xc000132008,指针的值=43
    fmt.Printf("指针p=%v,指针的值=%v\n",p, *p)

    // 指针p=0xc000128008,指针的值=30
    *p = 30
    fmt.Printf("指针p=%v,指针的值=%v\n",p, *p)
}

3. 指针使用细节

  • 所有的值类型变量都会有对应的指针类型,比如:所有的 intfloat 类型、boolstring数组结构体 struct
值类型指针类型
int* int
float32* float32
float64* float64
bool* bool
string* string