Golang中指针变量声明的疑问

Golang中指针变量声明的疑问 你好,我正在学习指针。

这两者有什么区别?

var n *int

var n int

? 在应用程序中它们各自会如何使用?

3 回复

谢谢您,先生。

更多关于Golang中指针变量声明的疑问的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在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的值

指针主要用于共享数据、避免复制开销和实现复杂数据结构,而值变量用于大多数不需要共享状态的场景。

回到顶部