美文网首页go学习
go的传值和传引用

go的传值和传引用

作者: 咕咕鷄 | 来源:发表于2017-01-18 12:24 被阅读0次

go可以看成增强版的C语言,因此也在一定程度上延续了C的一些特性。和C一样Go语言的函数调用参数全部是传值的,包括 slice/map/chan 在内所有类型,没有传引用的说法,传指针也是将指针的值拷贝一份。

那Go语言有传引用的说法吗?
Go语言其实也是有传引用的地方的,但是不是函数的参数,而是闭包对外部环境是通过引用访问的。

func main() {
    a := new(int)
    fmt.Println(a)
    func() {
        a = nil
    }()
    fmt.Println(a)
}

输出

0xc42000a3c8
<nil>

因为闭包是通过引用的方式使用外部环境的a变量, 因此可以直接修改a的值.

比如下面2段代码的输出是截然不同的, 原因就是第二个代码是通过闭包引用的方式输出i变量:

for i := 0; i < 5; i++ {
    defer fmt.Printf("%d ", i)
    // Output: 4 3 2 1 0
}
fmt.Printf("\n")
    for i := 0; i < 5; i++ {
    defer func(){ fmt.Printf("%d ", i) } ()
    // Output: 5 5 5 5 5
}

像第二个代码就是于闭包引用导致的副作用, 回避这个副作用的办法是通过参数传值或每次闭包构造不同的临时变量:

// 方法1: 每次循环构造一个临时变量 i

for i := 0; i < 5; i++ {
    i := i
    defer func(){ fmt.Printf("%d ", i) } ()
    // Output: 4 3 2 1 0
}

// 方法2: 通过函数参数传参

for i := 0; i < 5; i++ {
    defer func(i int){ fmt.Printf("%d ", i) } (i)
    // Output: 4 3 2 1 0
}

我是咕咕鸡,一个还在不停学习的全栈工程师。
热爱生活,喜欢跑步,家庭是我不断向前进步的动力。

相关文章

  • go的传值和传引用

    go可以看成增强版的C语言,因此也在一定程度上延续了C的一些特性。和C一样Go语言的函数调用参数全部是传值的,包括...

  • <>

    数组和切片 切片和数组的区别 数组是属于值类型。结构体,基础类型数据也属于值类型。 注意GO语言对于“传值和传引用...

  • JavaScript学习 之 传值or传引用

    目录 引言 传值? 传引用? 基础类型传值-对象类型传引用? 传共享! 小结 引言 JavaScript的函数参数...

  • JavaSE基础面试题

    1、Java里的传引用和传值的区别是什么? 答案:传引用是指传递的是地址而不是值本身,传值则是传递值的一份拷贝。 ...

  • Python 函数中,参数是传值,还是传引用?

    Python 函数中,参数是传值,还是传引用? 代码示例 在 C/C++ 中,传值和传引用是函数参数传递的两种方式...

  • Go语言map和slice的内存管理

    1. 前言   Go语言传参既支持传值,也支持传引用。基础类型的传递比较清晰,本文记录下传递map和slice的原...

  • java调用方法传递机制

    java是传值,不是传引用,有人说有的人说:基础类型传值,对象类型传引用。其实对象类也是传值,只不过对象的值恰好是...

  • Go每日精选(2019-06-14)- 基础部分

    1. Go语言的传参和传引用 2. PHP转Go系列:数组与切片 3. Golang 入门 : channel(...

  • PHP传值和传引用

    传值 把实参的值赋值给行参,相当于copy,系统将为目标对象重新开辟一个完全相同的内存空间 对行参的修改不...

  • Vue 传值和传引用

    一.传值 1.传值:string number boolean 建立了两个子组件Header.vue和Footer...

网友评论

    本文标题:go的传值和传引用

    本文链接:https://www.haomeiwen.com/subject/qrovbttx.html