• Go语言_函数学习篇


    这里要说一下是Go函数和一些其他语言不一样的地方

    1 函数格式不同

    func GetMsg(i int) (r string) {
    	fmt.Println(i)
    	r = "hi"
    	return r
    
    }

    func说明这个是个函数

    GetMsg是函数名

    (i int) 函数接收一个int参数

    (r string) 函数返回一个string类型返回值

    2 函数可以返回多个返回值

    这点和c,php都不一样,和lua是一样的

    func GetMsg(i int) (r string, err string) {
    	fmt.Println(i)
    	r = "hi"
    	err = "no err"
    	return r,err
    
    }

    3 defer的使用

    defer的意思是"在函数退出时调用",特别用于对文件进行读写操作的时候,需要在open之后要调用close操作,将close操作使用defer

    func ReadFile(filePath string)(){
        file.Open(filePath)
        defer file.Close()
        
        if true {
            file.Read()
        } else {
            return false
        }
    
    }

    这样写的意思是在file.Open后不立即调用close,当return false的时候调用file.Close().这样就有效避免了C语言中的内存泄露问题。

    4 比较难理解的:panic,recover和defer

    推荐看这篇博客:

    http://blog.golang.org/2010/08/defer-panic-and-recover.html

    defer的作用上一节说得很清楚了。

    Panic和Recover我们就将他们看成是其他语言中的throw和catch

    下面这个例子:

    package main
    
    import "fmt"
    
    func main() {
        f()
        fmt.Println("Returned normally from f.")
    }
    
    func f() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("Recovered in f", r)
            }
        }()
        fmt.Println("Calling g.")
        g(0)
        fmt.Println("Returned normally from g.")
    }
    
    func g(i int) {
        if i > 3 {
            fmt.Println("Panicking!")
            panic(fmt.Sprintf("%v", i))
        }
        defer fmt.Println("Defer in g", i)
        fmt.Println("Printing in g", i)
        g(i + 1)
    }

    返回了:

    Calling g.
    Printing in g 0
    Printing in g 1
    Printing in g 2
    Printing in g 3
    Panicking!
    Defer in g 3
    Defer in g 2
    Defer in g 1
    Defer in g 0
    Recovered in f 4
    Returned normally from f.

    Panic抛出了信息,并且跳出函数。Recover接受到了信息,并且继续处理。

    这个例子理解了基本就掌握了Recover和Panic

    实时了解作者更多技术文章,技术心得,请关注微信公众号“轩脉刃的刀光剑影”

    本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

  • 相关阅读:
    Cannot execute request on any known server
    swagger快速开发
    SpringBoot(七):SpringBoot整合Swagger2
    集群、分布式
    分布式架构--基本思想汇总
    Mysql联合查询union和union all的使用介绍
    Mysql 语句执行顺序
    Spring AOP四种实现方式Demo详解与相关知识探究
    jvm运行时环境属性一览
    使用ObjectOutputStream进行socket通信的时候出现固定读到四个字节乱码的问题
  • 原文地址:https://www.cnblogs.com/yjf512/p/2532502.html
Copyright © 2020-2023  润新知