Go语言函数

GO语言函数

  1. GO语言是由函数组成的
  2. 没有返回值没有形参的函数
  3. 有返回值没有形参的函数
  4. 没有返回值有形参的函数
  5. 有返回值有形参的函数
  • 函数格式
func 函数名称 (形参列表)(返回值列表){
     函数语句
}
  • 注意点:
  1. GO语言中函数不用声明可以直接使用
  2. 如果只有一个返回值,返回值列表的" () "可以省略
package main

import "fmt"

func main() {

    res :=sum(10,20)
    fmt.Println(res)  // 30
}

func sum(a,b int) int {  // 返回值列表省略
    res := a + b
    return res
}
  1. GO语言函数如果有返回值的话,可以在返回值列表中定义变量,可以在函数中直接使用变量, return 后面就可以不用写任何内容了 系统默认会将返回值列表定义的变量返回
package main

import "fmt"

func main() {

    res :=sum(10,20)
    fmt.Println(res)  // 30
}

func sum(a,b int)(resule int) {
    resule = a + b
    return
}
  1. GO语言中可以有多个返回值
  2. 如果有多个返回值, 但是只想使用其中一个的话 可以利用 " _ "来忽略掉不需要的那个值
package main

import "fmt"

func main() {

    res,_ :=getNum()
    fmt.Println(res)  // 666
}

func getNum()(a,b int){

    a = 666
    b = 888
    return
}
  1. 如果多个返回值类型形参类型一样 只需要在最后一个变量后面写上数据类型就行
  • 如果想在函数内部修改外界传入的实参, 和C语言的函数一样必须传入指针
package main

import "fmt"

func main() {

    a := 23
    change(&a)
    fmt.Println(a)
}

func change(a *int){
    *a = 999
}

匿名函数

  • 概念
    匿名函数就是没有名字的函数
package main

import "fmt"

func main() {

    //定义一个匿名函数立即调用
    func(){
        fmt.Println("匿名函数")
    }()
}
  • 注意点
  1. 匿名函数定义完,必须马上被调用,否则编译器会报错
  2. 可以将一个匿名函数保存到变量里面
package main

import "fmt"

func main() {

    //定义一个函数变量 保存 匿名函数
    var fn func()   // fn 函数变量名称   func() 函数数据类型

    fn =  func(){
        fmt.Println("变量保存匿名函数格式1")
    }

    fn()
    
}


package main

import "fmt"

func main() {
    // 第二种格式

    fn := func() {
        fmt.Println("变量保存匿名函数格式2")
    }

    fn()  // 调用
}


  1. 所以GO语言可以用函数类型来定义变量(类似C语言中指向函数的指针变量)
  2. 定义函数变量的格式和定义变量的格式一样适用
  • 应用场景
  1. 如果一个函数只会被调用一次的时候就会使用匿名函数
  2. 或者作为函数的参数返回值传入
  • 匿名函数作为参数
package main

import "fmt"

func main() {

    var fn func(int,int)int = func(a int,b int)int {
        return a + b
    }

    fmt.Printf("%T",fn)   // func(int, int) int

    res1 := calculater(10,20,fn)

    res2 := calculater(10,20, func(a int, b int) int {
        res:= a + b
        return res
    })

    fmt.Println("res1 = ",res1)  // 30

    fmt.Println("res1 = ",res2)  // 30
}

func calculater(a,b int ,method func(int,int) int ) (int){

    res:= method(a,b)

    return  res
}
  • 图解


    1.png
  • 匿名函数作为参数2
package main

import "fmt"

func main() {

    //匿名函数做为参数
    var fn func()
    fn = func() {

        fmt.Println("匿名函数")

    }

    fmt.Printf("fn = %p\n",fn)

    test(fn)
//或者可以转化为
    test( func() {

        fmt.Println("匿名函数")

    } )
    
}

func test(method func()){

    fmt.Printf("%p\n",method)

    method()
}
  • 图解


    微信图片_20180922153055.png
  • 匿名函数作为返回值
package main

import "fmt"

func main() {

    var fn func()

    fn = test()

    fn()

}

func test()func() {

    return func() {
        fmt.Println("匿名函数")
    }
}
  • 画图简解


    微信图片_20180922160045.png
  • 匿名函数作为返回值

package main

import "fmt"

func main() {
    
    var fn func(int,int)int  // 创建相同的返回值类型 func(int,int)int  就可以接收他

    fn = test()   //  接收test 函数的返回值

    res := fn(10,30)   // 调用

    fmt.Println(res)   // res = 40
    
}

func test()func(int,int)int {   //返回值类型为  func(int,int)int 

    return func(a int,b int)int {
        return  a + b
    }
}
  • 匿名函数练习
package main

import "fmt"

func main() {
    
    work(func() {
        fmt.Println("开会")
        fmt.Println("写报告")
        fmt.Println("提交方案")
        fmt.Println("写代码")
    })
}

// 每个人工作的一天
func work(method func()){
    // 上班前
    func(){
        fmt.Println("起床")
        fmt.Println("刷牙")
        fmt.Println("吃早饭")
        fmt.Println("上班")
        fmt.Println("打卡")
    }()

    // 上班内容
    method()

    //下班
    func (){
        fmt.Println("下班")
        fmt.Println("打卡")
        fmt.Println("回家")
    }()
}
  • 图解


    微信图片_20180922160045.png

闭包

  • 概念
    闭包就是一个特殊的匿名函数, 只要匿名函数中用到了外界的变量 那么我们就吧匿名函数叫做闭包
  • 注意点
    只要闭包还在使用外界的变量,那么外界的变量就会一直存在
  • 代码演示
package main

import "fmt"

func main() {

    num := 10

    a := func() {
        
        num++    /这里的num 就是匿名函数外界的变量 所以这就是一个闭包
        
        fmt.Println(num)
        
    }
    a() //11
    a() //12
    a() //13
}
package main

import  "fmt"

func main() {

    fn:= add()  //因为add返回的是一个闭包 所以fn 就是闭包 所以x会一直在
    fn() //2
    fn() //3
    fn() //4
}

func add()func(){

    x := 1

    return func() {
        x++
        fmt.Println(x)
    }
}

defer 语句

  • 格式

    defer 语句
    
  • 作用

  1. defer就是用来延迟执行,会在所属函数执行完毕后再执行defer语句
  • 应用场景
    常用于 资源释放,解锁,错误处理等等

  • 注意点
    如果在一个函数里面定义了多个defer语句,那么会遵守先进后执行,后进先执行的,规律

package main

import "fmt"

func main() {

    defer fmt.Println("第一条语句")  / 第四个执行
    defer fmt.Println("第二条语句")  / 第三个执行
    defer fmt.Println("第三条语句")  / 第二个执行
    defer fmt.Println("第四条语句")  / 第一个执行

}

init 函数

  • 在Go语言中保留了两个函数,一个是main函数 一个就是init函数, 他们都是由系统调用的
  • 格式
func init( ){  }
  • init函数的作用
    对当前文件进行初始化

  • Go语言的调用顺序

    main包--->常量--->全局变量--->init函数--->main函数--->逻辑代码--->退出程序
    
  • 注意点

  1. main函数只能在main包里(package main) , 并且一个程序只能有一个main
  2. init函数每个包都可以有
  3. 并且每个包可以有多个,但是推荐每个包只写写一个
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 函数 Go语言函数格式func 函数名称(形参列表)(返回值列表){函数语句} Go语言函数的类型没有返回值没有形...
    喝酸奶要舔盖__阅读 462评论 0 0
  • 函数 Go语言和C语言一样也有函数的概念, Go语言中函数除了定义格式和不用声明以外,其它方面几乎和C语言一模一样...
    极客江南阅读 882评论 3 6
  • 只描述和C语言中函数的区别 Go语言函数不需要声明 Go语言的函数是一等公民,和变量一样,可以赋值给某一变量(匿名...
    AuglyXu阅读 523评论 0 0
  • 作为老师,我们总是站在自己的角度去思考如何教,而从不去站在学生的那一方去想什么样的课堂才是最有效的。今天听了王老师...
    陕县1730赵丹阅读 141评论 0 0
  • 早上,应承某学妹的邀请,参加一个名为“百万晨读”的活动,也许有朋友知道这个,据说在微博还挺火。 我一开始听到这个词...
    F念之阅读 309评论 6 11

友情链接更多精彩内容