06-GoLang函数

2018-10-08  本文已影响0人  箩篼

函数格式

在C语言中函数只能返回一个值

返回值类型 函数名称(形参列表){
  逻辑语句;
    }
在Go语言中函数可以返回多个值

func 函数名称(形参列表) (返回值列表){
  逻辑语句;
    }
package main
import "fmt"
func main() {
    //1.返回一个值
    var num int = getValue()
    fmt.Printf("%d\n", num)
    //2.返回两个值
    num1, num2 := calculate()
    fmt.Printf("%d, %d\n", num1, num2)
}

func getValue()(int) {
    return  666
}
func calculate()(int, int){
    return 10, 20
}


C语言函数的类型

Go语言函数的类型和C语言一样

注意点:

//没有返回值没有形参
func say(){
    fmt.Println("没有返回值没有形参")
}
//没有返回值有形参的函数
func sum(a , b int){
    res := a + b
    fmt.Println(res)
}
//有返回值有形参的函数
func minus(a, b int)(res int){
    res = a - b
    return
}
func minus(a int, b int)(int){
    res := a - b
    return res
}
//省略
func getNumber()int{
    return 888
}
func getValue() (num ,value int){
    return 666, 888
//注意:外界要定义两个变量接收
}
func getNumber() (num int){
    num = 999
    return
}
func getValue() (int, int){
    return 666, 888
}
package main
import "fmt"
func main()  {
a, _ := getValue()
    fmt.Println("a = ", a)
}
func getValue() (num ,value int){
    return 666, 888
}


函数参数

package main
import "fmt"
func main() {
    num := 666
    change1(num)
    fmt.Println(num)   //666
}
func change1(a int) {
    a = 789
}
package main

import "fmt"

func main() {
    num := 666
    change2(&num)
    fmt.Println(num)   //789
}
func change2(a *int) {
    *a = 789
}

匿名函数

 // 直接定义一个函数, 然后立即调用这个函数
     func(){
        fmt.Println("匿名函数")
     }()

1、作为其他函数的参数

package main
import "fmt"
func main() {
//匿名函数作其他函数参数
result := calculate(10, 20, func(a, b int) int {
        return  a + b
    })
}
//定义函数时将匿名函数类型作为参数传递,此时的函数有临时的名字,即method
func calculate(a, b int, method func(int, int) int) (int) {
    res := method(a, b)
    return res
}
package main
import "fmt"
func main() {
     //此处限定一个
    test(func() {
        fmt.Println("匿名函数")
    })
}
func test(method func())  {
    fmt.Printf("%p\n", method)  //0x48d160
    method()
}

2、作为其他函数的返回值

package main
import "fmt"
func main() {
    res := test()
    res(10, 20)
}
func test() func(int, int) {
    return func(a int, b int) {
        fmt.Println(a + b)
    }
}

注意点:

    int test(int a, int b){}
    int (*test)(int, int)
    // 代表定义了一个名称叫做fn的变量, 这个变量的类型是一个函数  func(int, int) int
     // 这个函数可以接收两个int类型的形参, 并且可以返回一个int类型的结果
     // 也就是说变量fn将来可以保存所有接收两个int类型形参返回一个int类型结果的函数
     var fn func(int, int) int
     fn = func(a int, b int) int {
         return a + b
     }
var fn func(int, int) int = func(a int, b int) int {
        return a + b
     }
// 相当于
 func fn(a int, b int) int {
        return a + b
     }
 fmt.Printf("%T\n", fn) // func(int, int) int

var f= func() {
        fmt.Println("匿名函数")
    }
     // 定义一个函数类型的变量, 保存匿名函数, 然后通过函数类型的变量调用匿名函数
     f := func() {
        fmt.Println("匿名函数")
    }
     fmt.Printf("%T\n", f)   //func()
    var fn func(int,int)int
    fn = func(a int, b int) int{
        return a + b
    }
    var method func(int, int)int
    method = fn
package main
import (
    "fmt"
)
func main() {

    //work(func() {
    //  fmt.Println("参与部门会议")
    //  fmt.Println("修改BUG")
    //  fmt.Println("完成老大安排的任务")
    //  fmt.Println("... ...")
    //  fmt.Println("提交代码")
    //})

    work(func() {
        fmt.Println("组织部门会议")
        fmt.Println("给部门的员工分配任务")
        fmt.Println("检查部门员工昨天提交的代码")
        fmt.Println("... ...")
    })
}
// 攻城狮的一天
func work(method func()){
    // 1.上班前
    func(){
        fmt.Println("起床")
        fmt.Println("刷牙洗脸")
        fmt.Println("吃早餐")
        fmt.Println("做地铁")
        fmt.Println("打卡")
        fmt.Println("打开电脑")
    }()

    // 2.上班中
    method()

    // 3.下班之后
    func(){
        fmt.Println("关电脑")
        fmt.Println("打卡")
        fmt.Println("坐地铁")
        fmt.Println("到家")
        fmt.Println("吃饭")
        fmt.Println("娱乐")
        fmt.Println("刷牙洗脸")
        fmt.Println("睡觉")
    }()

}

// 项目经理的一天
func work2(){
    fmt.Println("起床")
    fmt.Println("刷牙洗脸")
    fmt.Println("吃早餐")
    fmt.Println("做地铁")
    fmt.Println("打卡")
    fmt.Println("打开电脑")

    fmt.Println("组织部门会议")
    fmt.Println("给部门的员工分配任务")
    fmt.Println("检查部门员工昨天提交的代码")
    fmt.Println("... ...")

    fmt.Println("关电脑")
    fmt.Println("打卡")
    fmt.Println("坐地铁")
    fmt.Println("到家")
    fmt.Println("吃饭")
    fmt.Println("娱乐")
    fmt.Println("刷牙洗脸")
    fmt.Println("睡觉")
}
// 程序员的一天
func work1()  {
    fmt.Println("起床")
    fmt.Println("刷牙洗脸")
    fmt.Println("吃早餐")
    fmt.Println("做地铁")
    fmt.Println("打卡")
    fmt.Println("打开电脑")

    fmt.Println("参与部门会议")
    fmt.Println("修改BUG")
    fmt.Println("完成老大安排的任务")
    fmt.Println("... ...")
    fmt.Println("提交代码")

    fmt.Println("关电脑")
    fmt.Println("打卡")
    fmt.Println("坐地铁")
    fmt.Println("到家")
    fmt.Println("吃饭")
    fmt.Println("娱乐")
    fmt.Println("刷牙洗脸")
    fmt.Println("睡觉")
}


闭包

package main
import "fmt"
func main() {
     num := 10
     a := func() {
        num++
        fmt.Println(num)
     }
     a() // 11
     a() // 12
     a() // 13
     // addUpper会返回一个闭包, 那么fn中保存的就是这个闭包, 那么fn就等于闭包
     // 所以按照Go语言的规则, 只要fn还在, addUpper中被闭包引用的变量就不会释放
     fn := addUpper()
     fn()
     fn()
     fn()
}
func addUpper() func() {
    x := 1
    return func() {
        x++
        fmt.Println(x) // 2 , 3 , 4
    }
}

延迟调用

  package main
  import "fmt"
  func main() {
    defer fmt.Println("我是第一个被注册的") // 3
    fmt.Println("main函数中调用的Println") // 1
    defer fmt.Println("我是第二个被注册的") // 2
  }

package main
import "fmt"
func main() {
    /*
    1.defer语句的格式
    defer 语句

    2.defer语句的作用
    延迟执行, 会在所属函数执行完毕之后再执行
    常用于资源释放, 解锁, 错误处理等等
    以前在C语言中我们说过, 通过malloc申请的存储空间, 一定更要释放free
    但是由于我们不能写完malloc之后立即free,所以经常导致我们忘记释放
    malloc -- >申请存储空间
    ... ... --> 使用存储空间
    free --> 释放存储空间
    
    注意点:
    如果在同一个函数中编写了多个defer语句, 那么会遵守先进后出的原则
    先注册的defer语句后执行, 后注册的defer语句先执行
     */

     //fmt.Println("申请存储空间")
     //defer fmt.Println("释放存储空间")
     //fmt.Println("使用存储空间")
     //fmt.Println("使用存储空间")
     //fmt.Println("使用存储空间")

     defer fmt.Println("第一条语句")
     defer fmt.Println("第二条语句")
     defer fmt.Println("第三条语句")
     defer fmt.Println("第四条语句")
}


init函数

package main
import  "fmt"
const constValue  = 998 // 1
var gloalVarValue int = abc() // 2
func init() { // 3
    fmt.Println("执行main包中main.go中init函数")
}
func main() { // 4
    fmt.Println("执行main包中main.go中main函数")
}
func abc() int {
    fmt.Println("执行main包中全局变量初始化")
    return 998
}


输入输出函数

输出函数

    num, value := 10, 20
    fmt.Printf("num = %d, value = %d\n", num, value)
    fmt.Printf("------")
    num, value := 10, 20
    fmt.Println("num = ", num, "value = ",value)
    fmt.Println("----")

输入函数

    var num int;
    var value int;
    fmt.Scan(&num, &value)
    fmt.Println(num, value)
    var num int;
    var value int;
    fmt.Scanf("%d", &num)
    fmt.Println(num, value)

第三种方式:
格式:fmt.Scanln(地址列表)
特点: 如果接收的不是字符串类型(%c), 会忽略空格和TAB, 但是不会忽略回车

    var num int;
    var value int;
    fmt.Scanln(&num, &value)
    fmt.Println(num, value)
上一篇 下一篇

猜你喜欢

热点阅读