zoukankan      html  css  js  c++  java
  • golang学习笔记——函数

    不定参数类型函数定义 【args ...type
    package main
     
    import "fmt"
     
    func Func01(a byte, args ...int) {
       fmt.Printf("len(arg) is %d ", len(args))
       fmt.Printf("a is %c", a)
    }
     
    func main() {
       Func01('c', 13, 34, 45)
    }
    //********输出*********
    len(arg) is 3
    a is c
    定义函数类型
    package main
     
    import "fmt"
     
    func Add(a, b int) int {
       return a + b
    }
     
    //定义函数类型
    type FuncType func(int, int) int
     
    func main() {
       var fTest FuncType
       fTest = Add
       a := fTest(10, 20)
       fmt.Print(a)
    }
    //********输出*********
    30
    回调函数
    package main
     
    import "fmt"
     
    func Add(a, b int) int {
        return a + b
    }
     
    func Subtr(a, b int) int {
        return a - b
    }
     
    type FuncType func(int, int) int
     
    func Calculator(a int, b int, funx FuncType) {
        fmt.Printf("a is %d,b is %d ", a, b)
        result := funx(a, b)
        fmt.Printf("result is %d ", result)
    }
     
    func main() {
        Calculator(10, 20, Add)
        Calculator(20, 10, Subtr)
    }
    //******输出*********
    a is 10,b is 20
    result is 30
    a is 20,b is 10
    result is 10
    匿名函数
    package main
     
    import "fmt"
     
    func main() {
        a := 10
        s := "hello"
        //定义匿名函数
        f1 := func(i, j int) (result int) {
             fmt.Printf("a is %d,s is %s", a, s)
             result = i + j
             return
        }
     
        result := f1(10, 20)
        fmt.Printf("result is %d ", result)
     
        //定义匿名函数并直接调用
        sum := func(n, m int) (sum int) {
             sum = n + m
             return
        }(10, 40)
        fmt.Printf("sum is %d ", sum)
    }
    理解闭包函数的使用
    package main
     
    import "fmt"
     
    func Test() func() int {
        var x int
        return func() int {
             x++
             return x
        }
    }
     
     
    func Test2() int {
        var x int
        x++
        return x
    }
     
    func main() {
        f1 := Test()   //这里f1实际指向的是 func() int{} 函数
        fmt.Println(f1()) // 1
        fmt.Println(f1()) // 2
        fmt.Println(f1()) // 3
     
        f2 := Test2     // f2指向 Test2() int{} 函数
        fmt.Println(f2()) // 1
        fmt.Println(f2()) // 1
        fmt.Println(f2()) // 1
    }
    defer 延时调用(在函数中return之后执行)
    package main
     
    import "fmt"
     
    func main() {
        defer fmt.Println("hello")
        fmt.Println("world") //先输出 world 后输出 hello
    }
    • defer被声明时,参数是实时解析
    package main
     
    import "fmt"
     
    func main() {
        a := 10
        b := 20
     
        defer func(a, b int) {
             fmt.Printf("a = %d,b = %d ", a, b)
        }(a, b)
     
        a = 100
        b = 200
        fmt.Printf("a = %d,b = %d ", a, b)
        // a = 100,b = 200
        // a = 10,b = 20
    }
    • defer执行顺序,先进后出
    package main
     
    import "fmt"
     
    func main(){
       defer fmt.Println("aaaaaa")
       defer fmt.Println("bbbbbb")
       defer fmt.Println("cccccc")
       //先显示 cccccc 再显示 bbbbbb  最后显示 aaaaaa
    }
    • defer可以获取有名返回值
    package main
     
    import "fmt"
     
    func c() (i int) {
       defer func() {
          i++
       }()
       return 1
    }
     
    func main() {
       fmt.Println(c()) //输出 2
    }
    //*****分析********
    先执行c()函数里面的 return 1 由于定义c函数时定义了返回值的变量名为i,所以这时的i等于1
    defer 函数在return之后执行,也就是在 i=1 被赋值之后执行defer的函数,所以结果为 2
    package main
     
    import "fmt"
     
    func main() {
       fmt.Println(test()) //输出 2
       fmt.Println(test1()) //输出 5
    }
     
    func test() (result int) {
       defer func() {
          result++
       }()
       return 1
    }
     
    func test1() (result int) {
       t := 5
       defer func() {
          t = t + 5
       }()
       return t
    }
    //*******分析************
    test1() 返回 5 是因为函数定义的返回变量是 result 而 defer 函数中使用的变量是 t 而不是 result
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    以最少的循环把两个数组里面的相同结果输出来
    解决PL/SQL Developer连接数据库时出现 “ORA-12541:TNS:无监听程序”错误
    AOP中Advice执行两遍的原因
    Java注释@interface的用法
    Spring进阶教程之在ApplicationContext初始化完成后重定义Bean
    Java的注解机制——Spring自动装配的实现原理
    基数排序简单Java实现
    jQuery的选择器中的通配符
    SEO 网站页面SEO优化之页面title标题优化
    IntelliJ IDEA 中文乱码解决
  • 原文地址:https://www.cnblogs.com/itsuibi/p/14455461.html
Copyright © 2011-2022 走看看