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

    golang函数特点:
    a.不支持重载,一个包不能有两个名字一样的函数
    b.函数是一等公民,函数也是一种类型,一个函数可以赋值给变量
    c.匿名函数
    d.多返回值
     
    例子1
    func add(a, b int) int {
        return a + b
    }
    
    func test1() {
        fmt.Printf("aaaa")
        //函数返回值赋值
        c := add
        fmt.Printf("%p %T %p %T
    ", c, add, c, add)
    
        sum := c(10, 20)
        fmt.Println(sum)
    
        sum = add(10, 20)
        fmt.Println(sum)
    }
     
     
     
    函数参数传递方式:
    1、值传递
    2、引用传递
    注意:无论是值传递,还是引用传递,传递给函数的都是变量的副本,不过值传递是值的拷贝。引用传递是地址的拷贝,一般来说,地址拷贝更为高效。而值拷贝取决于拷贝的对象大小,对象越大,性能越低。
    注意2:map,slice,chan,指针,interface默认以引用的方式传递
     
    例子1
    
    
      //自定义类型
      type add_func func(int, int) int
    //自定义函数传递
    func operator(op add_func, a int, b int) int {
        //使用传进来的函数,进行操作
        return op(a, b)
    }
    
    func test2() {
        c := add
        fmt.Println(c)
        sum := operator(c, 100, 200)
        fmt.Println(sum)
    }

    命名返回值的名字:
    func add(a,b int)(c int){
        c = a+b
        return
    }
    func calc(a,b int)(sum int,avg int){
        sum = a+b
        avg = (a+b)/2
        return
    }
    这里的返回值都不用谢,已经在函数体中默认定义返回了

    _标识符,用来忽略返回值:
    func calc(a,b int)(sum int,avg int){
        sum = a+b
        avg = (a+b)/2
        return
    }
    func main(){
        sum,_:= calc(100,200)
    }

    可变参数表现形式:
    func add(arg...int)int{
    }

    func add(a int,arg...int)int{
    }

    func add(a int,b int,arg...int)int{
    }
    注意:其中arg是一个slice(切片),我们可以通过arg[index]依次访问

    defer用途:
    1.当函数返回时,执行defer语句。因此,可以用来做资源清理
    2.多个defer语句,按先进后厨的方式执行
    3.defer语句中的变量,在defer声明时就决定了
     
    应用场景:
    (1)关闭文件句柄
    func read(){
        file := open(filename)
        defer file.Close()
    }
    (2)锁资源释放
    func read(){
        mc.Lock()
        defer mc.Unlock()
    }
    (3)数据看连接释放


    递归函数
    递归函数的设计原则
    1)一个大的问题能够分解成相似的小问题
    2)定义好出口条件

    例子
    //例子四,递归求阶乘
    func calc(n int) int {
        if n == 1 {
            return 1
        }
        return calc(n-1) * n
    }
    
    func fab(n int) int {
        //斐波那契数列
        if n <= 1 {
            return 1
        }
        return fab(n-1) + fab(n-2)
    }


    闭包
    1、闭包:一个函数与其相关的引用环境组合而成的实体
     
    //闭包的例子
    //例子1
    func Adder() func(int) int {
        var x int
        //匿名函数
        f := func(i int) int {
            x = x + i
            return x
        }
        return f
    }
    
    func testClosure() {
        f1 := Adder()
        fmt.Println(f1(10))
        fmt.Println(f1(20))
        fmt.Println(f1(30))
    }
    //例子2
    func makeSuffixFunc(suffix string) func(string) string {
        return func(name string) string {
            if !strings.HasSuffix(name, suffix) {
                return name + suffix
            }
            return name
        }
    }
    
    func testClosure2() {
        func1 := makeSuffixFunc(".bmp")
        func2 := makeSuffixFunc(".jpg")
        fmt.Println(func1("test"))
        fmt.Println(func2("test"))
    }

    闭包比较难理解,留个例子后面自己回头再理解一下

  • 相关阅读:
    Ubuntu12.04 下安装QQ
    python下sqlite增删查改方法(转)
    你有哪些想要分享的 PyCharm 使用技巧?
    PEP 8
    macos 下安装virtualenv,virtualenvwrapper,然后在pycharm中正常配置方法日志
    最全Python爬虫总结(转载)
    Git 常用命令详解
    Python 扩展技术总结(转)
    使用setup.py安装python包和卸载python包的方法
    IPython3 notebook 成功配置Python2和Python3内核(Kernel)
  • 原文地址:https://www.cnblogs.com/xiaoqianghuihui/p/9682079.html
Copyright © 2011-2022 走看看