美文网首页
Go语言函数

Go语言函数

作者: 超级皮波9 | 来源:发表于2018-09-22 17:18 被阅读0次

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. 并且每个包可以有多个,但是推荐每个包只写写一个

相关文章

  • (四)go语言函数&参数传递

    go语言函数 基本语法 例子 go语言参数传递

  • 三、Go的函数

    三、Go的函数 Go语言最少有一个main()函数。 1、Go的函数定义: 2、函数参数 函数如果使用参数,该变量...

  • Go语言中的函数 为什么是一等公民

    关键点 Go语言中,支持: 普通函数 匿名函数 闭包 在Go语言中,函数属于一等公民(first-class)? ...

  • 09-Go语言函数

    函数 Go语言函数格式func 函数名称(形参列表)(返回值列表){函数语句} Go语言函数的类型没有返回值没有形...

  • Golang的Init函数和Main函数

    Init函数和main函数 go语言中的init函数用于包package初始化。该函数时go语言的一个重要特性in...

  • cgo

    cgo cgo是用来在Go语言中调用C语言的工具 Go语言调用C语言 简单C语言函数 在Go语言中需要通过impo...

  • 04-枚举常量

    Go语言枚举 c语言中的枚举 Go语言枚举 iota迭代器 Go语言输出函数 fmt.Printf("格式化字符串...

  • 10-Go语言函数-指趣学院

    函数 Go语言和C语言一样也有函数的概念, Go语言中函数除了定义格式和不用声明以外,其它方面几乎和C语言一模一样...

  • go 语言基础--函数

    1、函数 和C语言类型,Go语言也有函数的概念,语法如下: 2 参数和返回值 2.1 返回值 go 语言可以返回零...

  • Golang重要特征之init函数

    go语言中init函数用于包(package)的初始化,该函数是go语言的一个重要特性 inti函数主要特征: 1...

网友评论

      本文标题:Go语言函数

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