Golang中指针变量声明的疑问
Golang中指针变量声明的疑问 你好,我正在学习指针。
这两者有什么区别?
var n *int
和
var n int
? 在应用程序中它们各自会如何使用?
3 回复
https://dave.cheney.net/2017/04/26/understand-go-pointers-in-less-than-800-words-or-your-money-back 可惜 Dave Cheney 现在不怎么发帖了。
在Go语言中,这两种声明方式有本质区别:
类型区别
var n *int声明一个指向int类型的指针变量var n int声明一个int类型的值变量
内存表现
package main
import "fmt"
func main() {
// 情况1:指针变量
var ptr *int // ptr是nil,因为它还没有指向任何int变量
fmt.Printf("ptr类型: %T, 值: %v, 地址: %p\n", ptr, ptr, &ptr)
// 情况2:值变量
var value int // value被初始化为0
fmt.Printf("value类型: %T, 值: %v, 地址: %p\n", value, value, &value)
// 让指针指向value
ptr = &value
fmt.Printf("ptr现在指向: %p, 解引用值: %v\n", ptr, *ptr)
// 通过指针修改值
*ptr = 42
fmt.Printf("修改后value的值: %v\n", value)
}
实际应用场景
1. 指针的使用场景
// 需要在函数内部修改外部变量
func increment(n *int) {
*n++
}
func main() {
var count int = 10
increment(&count)
fmt.Println(count) // 输出: 11
}
// 避免大结构体的复制开销
type LargeStruct struct {
data [1000000]int
}
func processLarge(s *LargeStruct) {
// 操作大结构体,避免复制
s.data[0] = 1
}
// 实现链表等数据结构
type Node struct {
value int
next *Node
}
2. 值变量的使用场景
// 基本数值操作
func add(a, b int) int {
return a + b // 直接返回值
}
func main() {
var x int = 5
var y int = 3
result := add(x, y) // 传递值的副本
fmt.Println(result) // 输出: 8
}
// 不需要修改原值的情况
func double(n int) int {
return n * 2
}
关键区别总结
var n int // n是int类型,直接存储整数值
n = 10 // 直接赋值
var p *int // p是指针类型,存储内存地址
p = &n // p指向n的地址
*p = 20 // 通过指针修改n的值
指针主要用于共享数据、避免复制开销和实现复杂数据结构,而值变量用于大多数不需要共享状态的场景。

