Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > go语言指针

go语言指针常见操作方法

作者:讲不出  再见

指针是存储变量内存地址的变量,声明格式为`*T`,指针用于函数间共享数据、传递结构体等,本文给大家介绍go语言指针常见操作方法,感兴趣的朋友一起看看吧

什么是指针?

指针是存储一个变量的内存地址的,声明一个指针变量的格式如下:

// ptr是指针变量名,*表示是指针类型,*int表示存储的是一个int类型变量的内存地址
var ptr *int

1、关键操作符

符号名称作用示例
&取址符获取变量在内存中的地址,返回指针类型ptr := &num (获取 num 的地址)
*解引用符

1. ‌声明时‌:表示指针类型(如 *int)

2. ‌使用时‌:获取或修改指针指向的具体值

val := *ptr (读取ptr指向的int变量值)

*ptr = 100 (修改ptr指向的int变量值为100)

2、常见操作

package main
import "fmt"
func main() {
    // 1.定义普通变量
    num := 100
    fmt.Printf("普通变量值: %d, 地址: %p\n", num, &num)
    // 2. 声明并初始化指针
    var ptr *int = &num // ptr 存储的是 num 的内存地址
    // 3. 解引用:读取和修改
    fmt.Printf("指针指向的值: %d\n", *ptr) // 输出 100
    *ptr = 200 // 通过指针修改原始变量的值
    fmt.Printf("修改后原始变量值: %d\n", num) // 输出 200,证明原值被改变
}

3、空指针

当指针变量未初始化时,默认为空指针,nil。

go语言底层将nil视为地址为0的特殊变量。

所以,空指针 ptr == nil 为true,但是在打印ptr指向的内存地址时,打印出的是 0x0【就是0】

危险操作:对 nil 指针进行解引用(如 *ptr)会导致程序运行时崩溃(panic: invalid memory address or nil pointer dereference)。

package main
import "fmt"
func main() {
	var ptr *int
	if ptr == nil {
		fmt.Printf("%p", ptr)
	} 
}

4、指针的使用场景

4.1、在函数间共享数据并修改原值

Go 语言默认参数传递是‌值传递‌(拷贝副本)。如果希望在函数内部修改外部变量的值,必须传递指针。

func increment(ptr *int) {
    *ptr++ // 修改指针指向的原始值
}
func main() {
    count := 10
    increment(&count) // 传入地址
    fmt.Println(count) // 输出 11
}

4.2、避免大型数据结构的拷贝开销

对于大型结构体(Struct)或数组,值传递会复制整个数据结构,消耗内存和 CPU。传递指针仅复制一个地址(64位系统占8字节),效率极高。

type BigData struct {
    Items int
}
// 使用指针接收,避免拷贝 10000 个 int
func process(data *BigData) {
    // 处理逻辑
}

5、注意事项

1. 不可取地址的情况

你不能对以下对象使用 & 取地址,否则编译报错 cannot take the address of ...

2. 切片、Map 和 Channel 的特殊性

3. 内存逃逸与性能

4. 原子指针与 unsafe

到此这篇关于go语言指针常见操作方法的文章就介绍到这了,更多相关go语言指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文