你是不是一直觉得指针是编程里最吓人的概念?别慌,当初我学Go的时候也这样想,直到我把指针想象成外卖快递单号——你不需要整个外卖柜,只需要单号就能拿到麻辣烫!在Go中,指针就是内存地址的“单号”,让你直接操作数据,避免不必要的拷贝。
今天咱们就用最接地气的方式,彻底搞懂Go指针的使用方法。我保证,看完这篇,你不仅能理解指针为什么是性能优化的利器,还能在实际项目中灵活运用!
一、为什么Go需要指针?先从外卖说起
想象一下,你点了一份超大的麻辣香锅(包含10种食材)。如果店家给你送整个厨房过来,是不是太夸张了?更聪明的做法是给你一个取餐码,凭码取餐。
在Go中,当你传递一个大型结构体给函数时,如果没有指针,就相当于把整个厨房都搬过去——产生完整的副本,既耗时间又占内存。而传递指针,就像只给取餐码,轻便高效。
type BigData struct {
data [1000000]int // 100万个整数的数组
}
// 这样传参会很慢,因为会拷贝整个数组
func processData(b BigData) {
// 处理数据
}
// 这样传参很快,只传内存地址
func processDataByPointer(b *BigData) {
// 处理数据
}
看到区别了吗?指针就是让你的代码跑得更快的秘密武器!
二、指针基础:从“找房子”开始理解
2.1 什么是指针?
简单说,指针就是内存地址。每个变量都住在内存的某个“房子”里,指针就是这个房子的门牌号。
var score int = 95
var scorePointer *int = &score
这里:
score是变量名,相当于住户姓名&score取地址操作,相当于问“这个住户住哪?”*int是指针类型,表示“指向整数的指针”
2.2 声明和初始化指针
package main
import "fmt"
func main() {
// 方法1:先声明变量,再取地址
name := "小明"
var namePtr *string = &name
// 方法2:使用new函数直接创建
agePtr := new(int)
*agePtr = 25 // 给指针指向的位置赋值
fmt.Printf("name: %s, 地址: %p\n", name, namePtr)
fmt.Printf("age: %d, 地址: %p\n", *agePtr, agePtr)
}
运行结果:
name: 小明, 地址: 0xc000010200
age: 25, 地址: 0xc000018028
看到那个0

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



