Golang 函数

函数声明golang

func (p myType ) funcName ( a, b int , c string ) ( r , s int ) {

    return数组

}安全

  • func 关键字app

  • (p myType) 代表 函数所属于的类型对象!,即为特定类型定义方法,能够省去不写,即为普通的函数 (这里咱们主要讲解 普通的函数)函数

  • 函数名ui

  • 参数 (能够不声明)spa

  • 返回值 (能够不声明)code

  • 函数体对象

调用标准函数

Golang 提供了 大量的包和实用函数 供用户使用,这些函数被称为标准函数。常见的标准包有 fmt, math, os, time bytes 通常包名都是小写。、 
标准包的消息能够在 Go安装目录的 pkg 下面查看,也可使用godoc 查看。blog

  • 使用一个函数前首先,导入包名
  • 经过包名,调用函数

调用自定义函数

一般,一个可执行的Go程序通常都有一个 main 包,在 main包中必须声明一个 main 函数

调用 外部包的函数

若是须要调用外部包的函数,那么须要导入这个包,才能调用相关函数(首字母必须大写)。

调用内置函数

13个内置函数,这些内置函数,很是有用。 
len():能够获取数组,字符串,切片的长度 
panic() 能够直接做用于系统底层,用于错误处理。

变参函数

形式参数的 类型 和 个数 都是能够变化的。 
典型的变参函数有: fmt.Printf(), fmt.Scanf() exec.Command() 等

变参函数的声明

func functionName (variableArgumetName ... dataType) returnValue {...}

(1) 变参的类型是”…类型“,并且变参必须是函数的最后一个参数。若是函数还有其余的参数,好比放在 变参的前面。 func f1(a int ,s string, args ...int) {...} 
(2) 不定长 的变参,实际上就是一个切片,可使用 range 进行遍历。

变参函数的 传递

一个变参函数,如何将这些变参传递给另一个 变参函数呢? 
由于实际上变参就是一个切片,因此能够进行所有的传递,也能够进行部分的传递。

任意类型的 变参函数

当用户但愿传递不一样类型的参数的时候,就像 fmt.Printf() 能够接受 int string 等各类类型。 
此时,应该指定 变参 类型为为 空接口 interface{}

func f1(args... interface{}) //指定变参类型为 interface{}

在Go语言中,interface{} 能够指向任何数据类型,因此可使用 interface{}定义任意类型的变参。 同时 interface{] 也是类型安全的。 

package main

import (
    "fmt"
)

func main() {
    f1(2, "go", 8, "language", 'a', false, "A", 3.24)
}
// 采用 interface {} 做为类型
func f1(args ...interface{}) {

    var num = make([]int, 0, 6)
    var str = make([]string, 0, 6)
    var ch = make([]int32, 0, 6)   //字符类型,是int32的哦!
    var other = make([]interface{}, 0, 6) //采用 interface{}做为类型

    for _, arg := range args {
        switch v := arg.(type) {  //这个是什么用法?
        case int:
            num = append(num, v)
        case string:
            str = append(str, v)
        case int32:  //这里 'a' 被统计到了 int32中。
            ch = append(ch, v)
        default:
            other = append(other, v)
        }
    }

    fmt.Println(num)
    fmt.Println(str)
    fmt.Println(ch)
    fmt.Println(other)
}
输出为:
[2 8]
[go language A]
[97]
[false 3.24]

能够看到: Go 语言是类型安全的。 int 类型和 int32不是同一个类型,可是应该是兼容的。 字符 字面值 被当作rune类型(也就是 int32 类型,可是不是 int类型 )

 

匿名函数

声明:

func (参数列表)(返回值){函数体} //注意没有函数名,因此称为匿名函数 func (a, b int) int { return (a + b) }
  1. 能够随时在代码里定义匿名函数,而且将这个匿名函数 赋值 给一个变量。
  2. 能够随时定义匿名函数,而且 执行这个 匿名函数。(声明函数的时候,直接执行!)
package main import ( "fmt" ) func main() { //声明 而且直接将 匿名函数 赋值 给变量f f := func(a, b int) int { return a + b } // 对函数类型的变量尽心调用 sum := f(2, 3) fmt.Println(sum) // 声明 而且 直接执行 匿名函数 sum = func(a, b int) int { return a + b }(2, 3) fmt.Println(sum) }

注意: 使用 匿名函数,不能将它做为顶级函数使用,也就是说必定要将它放在其余函数的函数体中。 
2. 匿名函数中 能够 直接使用 上级函数中的变量(这也是其一个方便的用处)

defer 语句

  1. defer 语句 向函数进行注册。
  2. 在函数退出的时候执行(不管函数是 panic()仍是正常退出)
  3. defer 注册语句遵循 ”先注册,后执行“的顺序
  4. 能够 用 defer 语句进行一些资源清理工做。

Golang 异常恢复机制

golang 的 异常恢复机制,是采用 panic() / recover() 的机制。 

更详细的内容可见http://studygolang.com/articles/6238

相关文章
相关标签/搜索