博客
关于我
Go 函数详解
阅读量:739 次
发布时间:2019-03-22

本文共 2105 字,大约阅读时间需要 7 分钟。

Go语言函数入门

一、函数基础

函数在Go语言中是第一类类型,既可以作为其他函数的参数或返回值,也可以直接被调用。以下是函数的基本组成部分:

  • 函数定义:由func声明 keyword、函数名、参数列表、返回列表和函数体组成。
  • 函数名:函数名的首字母大小写决定其包可见性。
  • 参数和返回值:需用()包裹,返回值可省略。
  • 函数体:用{}包裹,且{必须位于同行行尾。
  • 例如:

    func A() { // 无输入参数,无返回值,默认返回0
    // 函数体
    }
    func B(a, b int) int { // 多个相同类型参数可用简写模式
    return a + b
    }
    func C(a, b int) (sum int) { // 有名返回值
    sum = a + b
    return
    }

    二、基本使用

    Go语言的函数特点:

  • 不支持默认值参数和函数重载。
  • 不支持函数嵌套定义,但支持嵌套匿名函数。
  • 支持多值返回,错误类型作为最后一个返回值。
  • 函数实参到形参的传递是值拷贝。
  • 对指针参数的处理需要谨慎。
  • 示例:

    // 1. 可有无输入参数和返回值
    func D(a, b int) (sum int) {
    sum := a + b
    return
    }
    // 2. 多个相同类型参数可用简写模式
    func E(a, b, c int) (max int) {
    return max(a, b, c)
    }
    // 3. 支持嵌套匿名函数
    func F(a, b int) (int, int) {
    return b, a
    }

    三、不定参数

    不定参数在Go语言中用于处理可变长度的参数列表,需满足以下条件:

  • 不定参数类型必须一致。
  • 不定参数必须是函数的最后一个参数。
  • 不定参数在函数体内相当于切片。
  • 示例:

    // 1. 不定参数类型相同
    func sum(arr ...int) (sum int) {
    for _, v := range arr {
    sum += v
    }
    return
    }
    // 2. 不定参数可以是切片
    func suma(arr ...int) int {
    for v := range arr {
    sum += v
    }
    return
    }

    四、函数类型

    函数类型(Function Signature)是去除函数名和参数名后的函数定义行。可以用type定义函数类型变量:

    示例:

    func add(a, b int) int { return a + b }
    func sub(x int, y int) int { return x - y }
    type Op func(int, int) int
    func do(f Op, a, b int) int {
    return f(a, b)
    }

    五、匿名函数

    匿名函数可直接赋值给变量或作为返回值使用:

  • 直接赋值给变量:
  • var sum = func(a, b int) int { return a + b }
    1. 作为返回值:
    2. func getAdd() func(int, int) int {
      return func(a, b int) int { return a + b }
      }
      1. 嵌套匿名函数:
      2. func main() {
        defer func() { // 使用 defer 注册延迟函数
        if err := recover(); err != nil {
        fmt.Println(err)
        }
        }()
        // ...
        }

        六、错误处理

        Go语言提供两种错误处理机制:

      3. panic:用于主动抛出错误,终止程序。
      4. recover:用于捕获panic,恢复执行。
      5. 示例:

        func main() {
        defer func() {
        if err := recover(); err != nil {
        fmt.Println(err)
        }
        }()
        // ...
        panic("错误信息")
        }

        错误接口error可用于函数返回值:

        type error interface {
        Error() string
        }
        func openFile(filename string) (file *os.File, error) {
        file, err := os.Open(filename)
        if err != nil {
        return nil, err
        }
        return file, nil
        }

        七、底层实现

        Go语言的函数机制基于以下原理:

      6. 函数调用基于栈。
      7. 不定参数和切片基于堆。
      8. 错误处理基于panic和recover机制。
      9. 如需进一步了解底层实现,可参考Go语言的官方文档。

    转载地址:http://onuwk.baihongyu.com/

    你可能感兴趣的文章
    NodeSession:高效且灵活的Node.js会话管理工具
    查看>>
    node~ http缓存
    查看>>
    node不是内部命令时配置node环境变量
    查看>>
    node中fs模块之文件操作
    查看>>
    Node中同步与异步的方式读取文件
    查看>>
    node中的get请求和post请求的不同操作【node学习第五篇】
    查看>>
    Node中的Http模块和Url模块的使用
    查看>>
    Node中自启动工具supervisor的使用
    查看>>
    Node入门之创建第一个HelloNode
    查看>>
    node全局对象 文件系统
    查看>>
    Node出错导致运行崩溃的解决方案
    查看>>
    Node响应中文时解决乱码问题
    查看>>
    node基础(二)_模块以及处理乱码问题
    查看>>
    node安装卸载linux,Linux运维知识之linux 卸载安装node npm
    查看>>
    node安装及配置之windows版
    查看>>
    Node实现小爬虫
    查看>>
    Node提示:error code Z_BUF_ERROR,error error -5,error zlib:unexpected end of file
    查看>>
    Node提示:npm does not support Node.js v12.16.3
    查看>>
    Node搭建静态资源服务器时后缀名与响应头映射关系的Json文件
    查看>>
    Node服务在断开SSH后停止运行解决方案(创建守护进程)
    查看>>