Golang 函数

函数声明

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

return

}

  • func 关键字
  • (p myType) 表明 函数所属于的类型对象!,即为特定类型定义方法,可以省去不写,即为普通的函数 (这里我们主要讲解 普通的函数)
  • 函数名
  • 参数 (可以不声明)
  • 返回值 (可以不声明)
  • 函数体

调用标准函数

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

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

调用自定义函数

通常,一个可执行的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

时间: 2024-11-29 10:24:28

Golang 函数的相关文章

golang函数可变参数传递性能问题

几天前纠结了一个蛋疼的问题,在go里面函数式支持可变参数的,譬如...T,go会创建一个slice,用来存放传入的可变参数,那么,如果创建一个slice,例如a,然后以a...这种方式传入,go会不会还会新建一个slice,将a的数据全部拷贝一份过去? 如果a很大,那么将会造成很严重的性能问题,不过后来想想,可能是自己多虑了,于是查看go的文档,发现如下东西: Passing arguments to ... parameters If f is variadic with a final pa

golang 函数作为类型

golang 函数作为类型 package main import "fmt" type A func(int, int) func (f A)Serve() { fmt.Println("serve2") } func serve(int,int) { fmt.Println("serve1") } func main() { a := A(serve) a(1,2) a.Serve() } type functinTyoe func(int)

GO开发[四]:golang函数

函数 1.声明语法:func 函数名 (参数列表) [(返回值列表)] {} 2.golang函数特点: a. 不支持重载,一个包不能有两个名字一样的函数 b. 函数是一等公民,函数也是一种类型,一个函数可以赋值给变量 c. 匿名函数 d. 多返回值 定义函数类型type: package main import "fmt" type add_func func(int, int) int func add(a, b int) int { return a + b } func sub

electron/nodejs实现调用golang函数

https://www.jianshu.com/p/a3be0d206d4c 思路 golang 支持编译成c shared library, 也就是系统中常见的.so(windows下是dll)后缀的动态链接库文件. c++可以调用动态链接库,所以基本思路是golang开发主要功能, c++开发插件包装golang函数,实现中转调用 对于类型问题, 为了方便处理, 暴露的golang函数统一接受并返回字符串, 需要传的参数都经过json编码, 返回值亦然. 这里实现了3种调用方式, 同步调用,

golang 函数和方法

由于自己是搞python开发的,所以在学习go时,当看到函数和方法时,顿时还是挺蒙的,因为在python中并没有明显的区别,但是在go中却是两个完全不同的东西.在官方的解释中,方法是包含了接收者的函数. 定义 函数的格式是固定的Func + 函数名 + 参数 + 返回值(可选) + 函数体 Func main( a, b int) (int) { } 而方法会在方法在func关键字后是接收者而不是函数名,接收者可以是自己定义的一个类型,这个类型可以是struct,interface,甚至我们可以

golang 函数-defer-recover-panic

函数 1.函数的定义 package main import "fmt" func add(a int, b int) int {  // 当函数参数类型相同时,除最后一个外其他类型可省略.                             // add(a int,b int) == add(a,b int) return a+b } func main(){ fmt.Println(add(1,2)) } //执行结果: # go run func.go 3 2.函数的多返回

golang 函数二 (匿名函数和闭包)

匿名函数就是没有定义函数名称的函数.我们可以在函数内部定义匿名函数,也叫函数嵌套. 匿名函数可以直接被调用,也可以赋值给变量.作为参数或返回值.比如: func main(){     func(s string){     //直接被调用         println(s)     }("hello gopher!!!")     /*     func(s string){     //未被调用         println(s)     }     */ } func mai

golang 函数笔记

一.概念 函数可以让我们将一个语句序列打包为一个单元,然后可以从程序中其它地方多次调用.函数的机制可以让我们将一个大的工作分解为小的任务,这样的小任务可以让不同程序员在不同时间.不同地方独立完成.一个函数同时对用户隐藏了其实现细节.由于这些因素,对于任何编程语言来说,函数都是一个至关重要的部分. 二.函数的声明及使用 package main import ( "fmt" ) func main() { say("hello") } func say(info st

golang 函数证明数组为 值类型 数据

package main import "fmt" func modify(arr [5]int) {     arr[0] = 10 // 试图修改数组的第一元素     fmt.Println("In modify() arr values:", arr) } func main() {     arrmain := [5]int{1, 2, 3, 4, 5} //定义并初始化一个数组     modify(arrmain)                  /