概述
我们将用几节来学习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 会在我们结束后运行。