• 美好生活的价值追求和实现路径-社会关注-理论频道-中工网 2018-05-21
  • 保罗亲手为自己圆梦 火箭勇士双双会师西部决赛 2018-05-21
  • Floating production, storage and offloading vessel delivered in Qingdao 2018-05-20
  • 汽車定位跟蹤官員意圖敲詐 追蹤器該怎麼管 2018-05-20
  • 工作队精准发力助力贫困村“摘帽” 2018-05-20
  • 中消协发布榨汁机比较试验结果 2018-05-20
  • 游花海林芝,赏野生桃花 2018林芝桃花节29日开幕 2018-05-20
  • 19米99轻松卫冕 巩立姣:没突破20米有点可惜 2018-05-18
  • 海南省工商局出实招提高干部素质 强化工作作风 2018-05-18
  • 栾蕾英亮相TOP100时尚盛典 盛装亮相仙气十足 2018-05-18
  • 以合法形式掩盖非法目的的合同效力 2018-05-18
  • 4月解放领跑重卡行业 红岩保持增幅第一 2018-05-17
  • 不查“后来”,中国电影难有未来 2018-05-16
  • 欧盟公司与伊朗合作将遭美国制裁?德媒:欧美或渐行渐远 2018-05-16
  • 《青草的清香》:探索感官和情感的发展史 2018-05-16
  • GO学习笔记:函数传值与传指针

    栏目: GO语言 发布于: 2014-08-20 16:23:15

    GO学习笔记:函数传值与传指针

    当我们传一个参数值到被调用函数里面时,实际上是传了这个值的一份copy,当在被调用函数中修改参数值的时候,调用函数中相应实参不会发生任何变化,因为数值变化只作用在copy上。

    为了验证我们上面的说法,我们来看一个例子:

    package main
    import "fmt"
    
    //简单的一个函数,实现了参数+1的操作
    func add1(a int) int {
        a = a+1 // 我们改变了a的值
        return a //返回一个新值
    }
    
    func main() {
        x := 3
    
        fmt.Println("x = ", x)  // 应该输出 "x = 3"
    
        x1 := add1(x)  //调用add1(x)
    
        fmt.Println("x+1 = ", x1) // 应该输出"x+1 = 4"
        fmt.Println("x = ", x)    // 应该输出"x = 3"
    }
    看到了吗?虽然我们调用了add1函数,并且在add1中执行a = a+1操作,但是上面例子中x变量的值没有发生变化

    理由很简单:因为当我们调用add1的时候,add1接收的参数其实是x的copy,而不是x本身。

    那你也许会问了,如果真的需要传这个x本身,该怎么办呢?

    这就牵扯到了所谓的指针。我们知道,变量在内存中是存放于一定地址上的,修改变量实际是修改变量地址处的内存。只有add1函数知道x变量所在的地址,才能修改x变量的值。所以我们需要将x所在地址&x传入函数,并将函数的参数的类型由int改为*int,即改为指针类型,才能在函数中修改x变量的值。此时参数仍然是按copy传递的,只是copy的是一个指针。请看下面的例子:

    package main
    import "fmt"
    
    //简单的一个函数,实现了参数+1的操作
    func add1(a *int) int { // 请注意,
        *a = *a+1 // 修改了a的值
        return *a // 返回新值
    }
    
    func main() {
        x := 3
    
        fmt.Println("x = ", x)  // 应该输出 "x = 3"
    
        x1 := add1(&x)  // 调用 add1(&x) 传x的地址
    
        fmt.Println("x+1 = ", x1) // 应该输出 "x+1 = 4"
        fmt.Println("x = ", x)    // 应该输出 "x = 4"
    }
    这样,我们就达到了修改x的目的。那么到底传指针有什么好处呢?

        1、传指针使得多个函数能操作同一个对象。

        2、传指针比较轻量级 (8bytes),只是传内存地址,我们可以用指针传递体积大的结构体。如果用参数值传递的话, 在每次copy上面就会花费相对较多的系统开销(内存和时间)。所以当你要传递大的结构体的时候,用指针是一个明智的选择。

        3、Go语言中string,slice,map这三种类型的实现机制类似指针,所以可以直接传递,而不用取地址后传递指针。(注:若函数需改变slice的长度,则仍需要取地址传递指针)

    本站文章除注明转载外,均为本站原创或编译?;队魏涡问降淖?,但请务必注明出处。
    转载请注明:文章转载自 七星彩票平台
    本文标题:GO学习笔记:函数传值与传指针
    IT技术书籍推荐:
    PHP从入门到精通(第3版)
    PHP从入门到精通(第3版)
    明日科技 (作者)
    《PHP从入门到精通(第3版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用PHP进行网络开发应该掌握的各方面技术。全书共分4篇25章,包括初识PHP、PHP环境搭建和开发工具、PHP语言基础、流程控制语句、字符串操作、正则表达式、PHP数组、PHP与Web页面交互、PHP与JavaScript交互、日期和时间、Cookie与Session、图形图像处理技术、文件系统、面向对象、PHP加密技术、MySQL数据库基础、phpMyAdmin图形化管理工具、PHP操作MySQL数据库、PDO数据库抽象层、ThinkPHP框架、Smarty模板技术、PHP与XML技术、PHP与Ajax技术、应用Smarty模板开发电子商务网站、应用ThinkPHP框架开发明日导航网等内容。书中所有知识都结合具体实例进行介绍,涉及的程序代码均附以详细的注释,可以使读者轻松领会PHP程序开发的精髓,快速提高开发技能。