Go语言基础3 - 函数

2020-03-16 16:47:57 浏览数 (1)

概述

我们将用几节来学习Go语言基础,本文结构如下:

代码语言:javascript复制
 函数
    -多值返回
    -可命名结果形参
    -Defer

函数

函数的基本语句结构:

代码语言:javascript复制
func DoSome(a int ) string{
  return "do"
}
  • func 是关键字,表示函数的开始。
  • 参数的写法是 变量名在前,类型在后。
  • 返回值写在函数的参数的括号后面,上面的例子返回值是 string

多值返回

函数和方法可返回多个值:

代码语言:javascript复制
func  Write(b []byte) (int, error)

上面的返回值,声明返回的是 int, error 这两个值。在一些需要返回错误信息的情况下会非常有用。

调用时,可以这么使用: r,e := Write() 使用 空白标识符可以忽略第二个参数: r,_ := Write()

可命名结果形参

函数的返回值可被命名,并作为常规变量使用,就像传入的形参一样。 比如:

代码语言:javascript复制
func nextInt(b []byte, pos int) (value, nextPos int) {

命名后,一旦该函数开始执行,它们就会被初始化为与其类型相应的零值;

若该函数执行了一条不带实参的 return 语句,则结果形参的当前值将被返回。

一个示例:

代码语言:javascript复制
  func ReadFull(r Reader, buf []byte) (n int, err error) {
    for len(buf) > 0 && err == nil {
        var nr int
        nr, err = r.Read(buf)
        n  = nr
        buf = buf[nr:]
    }
    return
  }

Defer

defer 语句用于 预先认为某个函数被调用。也可理解为 推迟执行函数。被 defer 的 函数会在执行 defer 所属于的函数返回之前 “立即执行"。

例如无论以何种路径返回,都必须释放资源的函数。 典型的例子就是关闭文件:

代码语言:javascript复制
  func Contents(filename string) (string, error) {
    f, err := os.Open(filename)
    if err != nil {
        return "", err
    }
    defer f.Close()  // f.Close 会在我们结束后运行。

0 人点赞