当前位置:

首页 > 编程开发 > Go指针类型的参数传递机制

Go指针类型的参数传递机制

Go指针类型参数传递有两种方式:值传递:函数获得指针副本,对副本的更改不影响原始指针。引用传递:函数获得对原始指针的引用,对引用的更改影响原始指针。

本文目录

    Go 指针类型参数传递有两种方式:值传递:函数获得指针副本,对副本的更改不影响原始指针。引用传递:函数获得对原始指针的引用,对引用的更改影响原始指针。

    Go指针类型的参数传递机制

    Go 指针类型参数传递机制

    在 Go 中,指针类型参数以两种不同的方式传递给函数:值传递和引用传递。

    值传递

    如果将指针值作为值传递给函数,则函数将获得该指针的副本。对该副本所做的任何更改都不会影响原始指针。

    代码示例:

    package main
    
    import "fmt"
    
    func changeValue(ptr *int) {
        *ptr = 10
    }
    
    func main() {
        ptr := new(int)
        *ptr = 5
        fmt.Println(*ptr) // 输出: 5
    
        changeValue(ptr)
        fmt.Println(*ptr) // 输出: 5
    }

    引用传递

    如果将指针地址作为值传递给函数,则函数将获得对原始指针的引用。对该引用所做的任何更改都会影响原始指针。

    代码示例:

    package main
    
    import "fmt"
    
    func changePointer(ptr **int) {
        *ptr = new(int)
        **ptr = 10
    }
    
    func main() {
        ptr := new(int)
        *ptr = 5
        fmt.Println(*ptr) // 输出: 5
    
        changePointer(&ptr)
        fmt.Println(*ptr) // 输出: 10
    }

    实战案例

    在以下实战案例中,我们使用值传递和引用传递来实现一个简单的链表。

    使用值传递实现链表:

    type Node struct {
        value int
        next *Node
    }
    
    func createList(values []int) *Node {
        head := &Node{value: values[0]}
        current := head
    
        for _, v := range values[1:] {
            next := &Node{value: v}
            current.next = next
            current = next
        }
    
        return head
    }
    
    func printList(head *Node) {
        for current := head; current != nil; current = current.next {
            fmt.Printf("%d ", current.value)
        }
        fmt.Println()
    }
    
    func main() {
        values := []int{1, 2, 3, 4, 5}
        head := createList(values)
        printList(head) // 输出: 1 2 3 4 5
    }

    使用引用传递实现链表:

    type Node struct {
        value int
        next **Node
    }
    
    func createList(values []int) *Node {
        head := &Node{value: values[0]}
        current := head
    
        for _, v := range values[1:] {
            next := &Node{value: v}
            *current.next = next
            current = next
        }
    
        return head
    }
    
    func printList(head *Node) {
        for current := head; current != nil; current = *current.next {
            fmt.Printf("%d ", current.value)
        }
        fmt.Println()
    }
    
    func main() {
        values := []int{1, 2, 3, 4, 5}
        head := createList(values)
        printList(head) // 输出: 1 2 3 4 5
    }

    在第一个示例中,我们使用值传递创建链表。在第二个示例中,我们使用引用传递创建链表。执行结果都是相同的,但使用引用传递时,我们可以在函数中修改链表的顺序。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 指针
    相关文章 更多
    WMV网页播放器参数中文详解
    WMV网页播放器参数中文详解

    下面这段代码,是一个基于经典的Windows Media Player ActiveX控件,用来在网页中嵌入视频播放器的完整示例。别看它现在似乎有点“古早”,但在某些特定场景下,这种实现方式依然有它的参考价值。 整段代码的核心是一个 标签,它负责在页面中引入并实例化播放器控件。我们来逐层拆解一下它的

    华为盘古 Ultra MoE 模型发布
    华为盘古 Ultra MoE 模型发布

    5月30日,华为推出了全新的AI模型——盘古UltraMoE,该模型的参数量达到了7180亿。作为一款接近万亿参数的MoE(MixtureofExperts)模型,它在整个训练过程中完全基于华为的昇腾AI平台完成,标志着华为在超大规模模型训练方面取得了重要进展。盘古UltraMoE的成功训练离不开盘古团队研发的一系列创新技术。例如,Depth-ScaledSandwich-Norm(DSSN)稳定架构的引入,显著改善了超大规模模型训练期间出现的梯度异常及

    Solaris 系统查看系统中CPU的数目
    Solaris 系统查看系统中CPU的数目

    要查看系统处理器信息,psrinfo(1M)命令是标准工具。不过,在多内核与多线程技术普及的今天,直接运行命令看到的可能并非物理CPU的实际数量。这时,加上-vp参数就非常关键了。 来看一个典型的例子: # psrinfo -vp The physical processor has 32 virt

    Golang指针与值类型函数表现解析
    Golang指针与值类型函数表现解析

    Go语言中所有函数参数传递都是值传递。传递值类型时复制数据本身,函数内修改不影响原始变量;传递指针类型时复制指针地址,可通过指针修改原始数据。对于大型结构体,使用指针传递可提升性能、减少内存开销;但需注意指针带来的nil风险和并发问题。slice、map虽为值传递,但其底层数据通过指针共享,因此修改元素会影响外部,而重新赋值则不会。常见误区包括误以为值传递能修改原始数据、不了解slice/map的引用特性及忽视大结构体复制的性能成本。

    C++指针类型推导 auto简化语法
    C++指针类型推导 auto简化语法

    <p>auto根据初始化表达式自动推导变量类型,如autoptr=&x推导为int,autoit=numbers.begin()简化迭代器声明,提升代码可读性与安全性。</p>

    Golang函数如何通过指针修改外部变量
    Golang函数如何通过指针修改外部变量

    Golang函数参数按值传递,需用指针修改外部变量;2.通过&取地址传参,*解引用修改值;3.结构体传指针可改字段且避免复制;4.注意避免nil指针和返回局部变量地址。

    指针类型决定内存解读方式解析
    指针类型决定内存解读方式解析

    指针的类型决定内存解释方式,包括读取字节数和算术运算步长。例如int读4字节,char读1字节,且p++按类型大小移动地址,确保数组正确遍历,编译器依类型生成访问指令,类型不同则数据解释结果不同,故指针类型至关重要。

    指针常量与常量指针区别详解
    指针常量与常量指针区别详解

    <p>const修饰指针时,若修饰ptr则内容不可改(常量指针),如constintptr;若修饰ptr则指针本身不可改(指针常量),如int*constptr;两者均修饰则为指向常量的常量指针。</p>

    C++指针实现数组传递方法
    C++指针实现数组传递方法

    <p>数组名作为参数传递时退化为指向首元素的指针,可通过指针形参接收并操作数组,如voidprintArray(int*arr,intsize)实现遍历。</p>

    C++动态矩阵指针实现方法
    C++动态矩阵指针实现方法

    使用指针实现动态矩阵需声明指向指针的指针,先用newint*[rows]分配行指针,再为每行执行newint[cols]分配列空间,最后通过matrixi访问元素。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。