Go篇|什么是指针

253 阅读2分钟

这是我参与更文挑战的第3天,活动详情查看: 更文挑战

什么是指针

指针,变量在内存中的存储位置,即内存地址

程序运行时数据会存储在内存中,每个存储数据的内存都会抽象为一系列具有连续编号的存储空间,这个编号就是内存地址。

Go语言中,指针,是一种数据类型,用来存储一个内存地址,该地址指向内存中的对象(对象:字符串、整数、函数、结构体)。

指针的声明与定义

  • 类型前加“&” 获取变量的内存地址
  • 类型前加 “*” 表示一个对应的指针类型
var str *string  // 定义一个指向string类型的数据
name := &str // 获取变量str的内存地址

通过var关键字定义的指针变量不能进行赋值,因其值为nil,即没有可指向的内存地址,如下代码运行时会报错

// 错误
var intP *int
*intP = 10
// 正确
intP := new(int)

指针的操作

  • 获取指针指向的值
  • 修改指针指向的值

可以通过demo上演示说明

// 1、通过*可以获取变量的值
name := "hello"
nameA := &name
nameB := *nameA
fmt.Println("nameA指针指向的值为:",nameB) 
//输出:nameA指针指向的值为: hello

//2、修改指针nameA的值
*nameA= "world"
fmt.Println("nameA指针指向的值为:",nameA) 
fmt.Println("nameB的值为:",nameB) 
//输出:
//nameA指针指向的值为: world
//name的值为: world
可以发现输出nameA值变了,name值也变了


指针参数

使用指针类型的参数,会改变函数中参数的值

// demo3
updatName(name)
fmt.Println("name的值为:",name)
updatName2(&name)
fmt.Println("name的值为:",name)

func updatName(name string)  {
    name = "jasen"
}
func updatName2(name *string)  {
    *name = "jasen"
}

//输出结果
//name的值为: hello
//name的值为: jasen

使用指针

  • 可以修改指向数据的值
  • 在变量赋值,参数传值的时候可以节省内存

使用指针的建议

  • map、slice、channel类型不使用指针
  • 修改方法接收者内部的数据或状态可使用指针
  • 修改参数的值或内部的数据,需要使用指针类型的参数
  • 比较大的结构体,参数传递或调用方法时需内存拷贝,内存占用多,可以考虑使用指针
  • 小数据类型不必使用指针,如 int,bool
  • 并发安全,尽可能不使用指针
  • 不嵌套使用指针,即一个指针指向指针的指针,避免导致代码复杂,可读性差

附录

整体代码
>>main.go code(点击展开) package main import "fmt"func main() { // demo1 name := "hello" nameA := &name nameB := *nameA fmt.Println("nameA指针指向的值为:",nameB) //demo2 *nameA= "world" fmt.Println("nameA指针指向的值为:",*nameA) fmt.Println("name的值为:",name) //demo3 updatName(name) fmt.Println("name的值为:",name) updatName2(&name) fmt.Println("name的值为:",name)} func updatName(name string) { name = "jasen" } func updatName2(name *string) { *name = "jasen" }