什么是指针
指针,变量在内存中的存储位置,即内存地址
程序运行时数据会存储在内存中,每个存储数据的内存都会抽象为一系列具有连续编号的存储空间,这个编号就是内存地址。
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"
}