Golang基础(闭包、值传递与引用传递)

一.闭包概述

  • 闭包不是Go语言独有的概念,在很多编程语言中都有闭包

  • 闭包就是解决局部变量不能被外部访问一种解决方案

  • 是把函数当作返回值的一种应用

二.代码演示

  • 总体思想为:在函数内部定义局部变量,把另一个函数当作返回值,局部变量对于返回值函数就相当于全局变量,所以多次调用返回值函数局部变量的值跟随变化

package main
​
import "fmt"
​
func main() {
    //res其实就是test1返回值函数,和之前匿名函数变量一个道理
    res := test1()
    fmt.Println(res()) //输出2
    fmt.Println(res()) //输出3
    fmt.Println(res()) //输出4
}
​
//注意此处,返回值类型是func int
func test1() func() int {
    i := 1
    return func() int {
        i = i + 1
        return i
    }
}
  • 如果重新调用test1()会重新声明及赋值局部变量i

package main
​
import "fmt"
​
func main() {
    f := test1()
    fmt.Println("f的地址", f) //输出匿名函数地址
    fmt.Println("f:", f()) //调用匿名函数输出2
    fmt.Println("f:", f()) //调用匿名函数输出3
    k := test1()
    fmt.Println("k的地址", k) //输出匿名函数地址,与f相等
    fmt.Println("k:", k()) //调用匿名函数输出2
    fmt.Println("f:", f()) //输出:4
    fmt.Println("k:", k()) //输出:3
}
​
func test1() func() int {
    i := 1
    return func() int {
        i++
        // 每调用一次test1()输出的地址不一样
        fmt.Println("i的地址:", &i)
        return i
    }
}
​

三. 值传递和引用传递

  • 讨论值传递和引用传递时,其实就是看值类型变量和引用类型变量作为函数参数时,修改形参是否会影响到实参

  • 在Go语言中五个引用类型变量,其他都是值类型

    • slice

    • map

    • channel

    • interface

    • func()

  • 引用类型作为参数时,称为浅拷贝,形参改变,实参数跟随变化.因为传递的是地址,形参和实参都指向同一块地址

  • 值类型作为参数时,称为深拷贝,形参改变,实参不变,因为传递的是值的副本,形参会新开辟一块空间,与实参指向不同

  • 如果希望值类型数据在修改形参时实参跟随变化,可以把参数设置为指针类型

四.代码演示

  • 值类型作为参数代码演示

package main
​
import "fmt"
​
func demo(i int, s string) {
    i = 5
    s = "改变"
}
​
func main() {
    i := 1
    s := "原值"
    demo(i, s)
    fmt.Println(i, s) //输出:1 原值
}
  • 引用传递代码示例

package main
​
import "fmt"
​
func demo(arg []int) {
   arg[len(arg)-1] = 110
}
​
func main() {
   s := []int{1, 2, 3}
   demo(s)
   fmt.Println(s) //输出:[1 2 110]
}
  • 如果希望值类型实参跟随形参变化,可以把值类型指针作为参数

package main
​
import "fmt"
​
//行参指针类型
func demo(i *int, s string) {
   //需要在变量前面带有*表示指针变量
   *i = 5
   s = "改变"
}
​
func main() {
   i := 1
   s := "原值"
   //注意此处第一个参数是i的地址,前面&
   //s保留为值类型
   demo(&i, s)
   fmt.Println(i, s) //输出:5 原值
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值