导读:本期聚焦于小伙伴创作的《Golang如何声明与初始化指针?Golang指针基本语法与常见写法有哪些》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Golang如何声明与初始化指针?Golang指针基本语法与常见写法有哪些》有用,将其分享出去将是对创作者最好的鼓励。

Golang中的指针是用来存储变量内存地址的特殊类型,和C/C++的指针相比,Golang的指针不支持指针运算,使用起来更加安全,掌握指针的声明与初始化是理解Golang变量传递机制的基础。

Golang如何声明与初始化指针?Golang指针基本语法与常见写法有哪些

Golang指针的声明语法

声明指针的核心是使用*符号,格式为var 指针变量名 *指针指向的类型,声明后的指针默认值为nil,表示不指向任何有效内存地址。

下面是几种常见的指针声明示例:

package main

import "fmt"

func main() {
    // 声明一个指向int类型的指针
    var intPtr *int
    // 声明一个指向string类型的指针
    var strPtr *string
    // 声明一个指向自定义结构体类型的指针
    type User struct {
        Name string
        Age  int
    }
    var userPtr *User

    fmt.Println(intPtr)  // 输出:<nil>
    fmt.Println(strPtr)  // 输出:<nil>
    fmt.Println(userPtr) // 输出:<nil>
}

Golang指针的初始化方法

指针声明后不能直接使用,需要先完成初始化,指向一个有效的变量内存地址,常见的初始化方式有以下几种。

1. 使用取地址符&初始化

通过&符号可以获取普通变量的内存地址,将其赋值给同类型的指针即可完成初始化,这是最常用的初始化方式。

package main

import "fmt"

func main() {
    num := 10
    // 将num的地址赋值给intPtr指针
    var intPtr *int = &num
    // 短变量声明方式初始化指针
    strPtr := &"hello"

    fmt.Println(intPtr)  // 输出:0xc00001a0b8(地址值随运行环境变化)
    fmt.Println(*intPtr) // 输出:10,通过*解引用获取指针指向的值
    fmt.Println(strPtr)  // 输出:0xc000010240(地址值随运行环境变化)
    fmt.Println(*strPtr) // 输出:hello
}

2. 使用new函数初始化

Golang内置的new函数可以分配对应类型的内存空间,返回该内存空间的指针,new函数的参数是类型,返回值是对应类型的指针。

package main

import "fmt"

func main() {
    // new函数分配int类型的内存,返回*int指针
    intPtr := new(int)
    // new函数分配结构体类型的内存,返回*User指针
    type User struct {
        Name string
        Age  int
    }
    userPtr := new(User)

    fmt.Println(intPtr)  // 输出:0xc00001a0b8(地址值随运行环境变化)
    fmt.Println(*intPtr) // 输出:0,new分配的内存会被初始化为零值
    fmt.Println(userPtr) // 输出:&{ 0}
    // 可以直接通过指针修改结构体字段
    userPtr.Name = "张三"
    userPtr.Age = 20
    fmt.Println(*userPtr) // 输出:{张三 20}
}

Golang指针常见写法

1. 指针作为函数参数

当需要在函数内部修改外部变量的值时,通常将指针作为函数参数传递,避免值传递带来的拷贝开销。

package main

import "fmt"

// 函数接收int类型指针,修改指针指向的值
func modifyNum(numPtr *int) {
    *numPtr = 20
}

func main() {
    num := 10
    fmt.Println("修改前:", num) // 输出:修改前: 10
    modifyNum(&num)
    fmt.Println("修改后:", num) // 输出:修改后: 20
}

2. 指针接收者的方法定义

给结构体定义方法时,如果方法需要修改结构体的字段,或者结构体体积较大需要避免拷贝,通常会使用指针作为接收者。

package main

import "fmt"

type User struct {
    Name string
    Age  int
}

// 指针接收者方法,修改结构体字段
func (u *User) UpdateAge(newAge int) {
    u.Age = newAge
}

// 值接收者方法,不修改结构体字段
func (u User) GetInfo() string {
    return fmt.Sprintf("姓名:%s,年龄:%d", u.Name, u.Age)
}

func main() {
    user := User{Name: "李四", Age: 18}
    fmt.Println(user.GetInfo()) // 输出:姓名:李四,年龄:18
    user.UpdateAge(22)
    fmt.Println(user.GetInfo()) // 输出:姓名:李四,年龄:22
}

3. 判断指针是否为空

使用指针前通常需要判断指针是否为nil,避免解引用空指针导致程序崩溃。

package main

import "fmt"

func main() {
    var ptr *int
    if ptr == nil {
        fmt.Println("指针为空,未初始化")
    }
    num := 10
    ptr = &num
    if ptr != nil {
        fmt.Println("指针已初始化,指向的值为:", *ptr)
    }
}

指针使用注意事项

  • 不要解引用nil指针,否则会触发panic
  • Golang的指针不支持指针运算,不能像C语言那样对指针进行加减操作
  • 函数返回局部变量的指针是安全的,Golang的逃逸分析会将局部变量分配到堆上
  • 结构体指针访问字段时可以直接使用.操作符,不需要先解引用再访问
指针的核心作用是减少值拷贝的开销,以及实现函数内部对外部变量的修改,不需要过度使用指针,普通场景下值传递已经足够满足需求。

Golang指针声明初始化基本语法修改时间:2026-07-17 00:18:34

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。