Golang 不可缺少的指针

简介: 指针,变量在内存中的存储位置,即内存地址程序运行时数据会存储在内存中,每个存储数据的内存都会抽象为一系列具有连续编号的存储空间,这个编号就是内存地址。

什么是指针

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

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

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"

}

目录
相关文章
|
7月前
|
存储 安全 编译器
Golang 语言中的指针介绍
Golang 语言中的指针介绍
36 0
|
6天前
|
Java Go
Golang深入浅出之-Go语言指针面试必知:理解与使用指针
【4月更文挑战第21天】Go语言中的指针允许直接操作内存,常用于高效数据共享和传递。本文介绍了指针的基础知识,如声明、初始化和解引用,以及作为函数参数使用。此外,讨论了`new()`与`make()`的区别和内存逃逸分析。在结构体上下文中,指针用于减少复制开销和直接修改对象。理解指针与内存管理、结构体的关系及常见易错点,对于面试和编写高性能Go代码至关重要。
19 2
|
7月前
|
Go
Golang 语言怎么打印结构体指针类型字段的值?
Golang 语言怎么打印结构体指针类型字段的值?
172 0
|
7月前
|
存储 安全 Go
Golang 语言 method 接收者使用值类型和指针类型的区别
Golang 语言 method 接收者使用值类型和指针类型的区别
30 0
|
6天前
|
C++ Go 自然语言处理
Golang每日一练(leetDay0047) 复制带随机指针链表、单词拆分I\II
Golang每日一练(leetDay0047) 复制带随机指针链表、单词拆分I\II
28 0
Golang每日一练(leetDay0047) 复制带随机指针链表、单词拆分I\II
|
6天前
|
Go
golang力扣leetcode 38.复制带随机指针的链表
golang力扣leetcode 38.复制带随机指针的链表
17 0
|
7月前
|
Go
Golang 语言怎么避免空指针引发的 panic
Golang 语言怎么避免空指针引发的 panic
72 0
|
7月前
|
存储 安全 Go
Golang 语言中的非类型安全指针
Golang 语言中的非类型安全指针
21 0
|
7月前
|
存储 算法 Go
100天精通Golang(基础入门篇)——第17天:深入解析Go语言中的指针
100天精通Golang(基础入门篇)——第17天:深入解析Go语言中的指针
34 0
|
12月前
|
存储 Go
Golang指针的操作以及常用的指针函数
Golang指针的操作以及常用的指针函数
61 0