当前位置: 代码迷 >> 综合 >> [ golang ] 函数
  详细解决方案

[ golang ] 函数

热度:97   发布时间:2024-01-27 04:59:22.0

七、函数

        在Go语言中,函数的基本组成为:关键字func、函数名、参数列表、返回值、函数体和返回语句

1、函数定义

func Add(a int, b int) (ret int, err error) {
  if a < 0 || b < 0 { // 假设这个函数只支持两个非负数字的加法
    err= errors.New("Should be non-negative numbers!")
    return
  }
  return a + b, nil // 支持多重返回值
}

2、函数调用

       只要事先导入了该函数所在的包,就可以直接按照如下所示的方式调用
函数:

import "mymath"// 假设Add被放在一个叫mymath的包中
// ...
c := mymath.Add(1, 2)

注意: go 语言要求函数以及变量的大小写,小写字母开头的函数只在本包内可见,大写字母开头的函数才能被其他包使用

 

3、不定参数

不定参数类型:

func myfunc(args ...int) {
for _, arg := range args {
fmt.Println(arg)
}
}

这段代码的意思是,函数myfunc()接受不定数量的参数,这些参数的类型全部是int

不定参数的传递

func myfunc(args ...int) {
//
按原样传递
myfunc3(args...)
//
传递片段,实际上任意的int slice都可以传进去
myfunc3(args[1:]...)
}

任意类型的不定参数

 

func Printf(format string, args ...interface{}) {
// ...
}

参考代码:varg1.go

package main
import "fmt"
func MyPrintf(args ...interface{}) {for _, arg := range args {switch arg.(type) {case int:fmt.Println(arg, "is an int value.")case string:fmt.Println(arg, "is a string value.")case int64:fmt.Println(arg, "is an int64 value.")default:fmt.Println(arg, "is an unknown type.")}}
}
func main() {var v1 int = 1var v2 int64 = 234var v3 string = "hello"var v4 float32 = 1.234MyPrintf(v1, v2, v3, v4)
}

4、多返回值

       与C C++Java等开发语言的一个极大不同在于, Go语言的函数或者成员的方法可以有多个返回值,这个特性能够使我们写出比其他语言更优雅、更简洁的代码,比如File.Read()函数就可以同时返回读取的字节数和错误信息。如果读取文件成功,则返回值中的n为读取的字节数, errnil,否则err为具体的出错信息

 

5、匿名函数和闭包

匿名函数是指不需要定义函数名的一种函数实现方式

        在Go里面,函数可以像普通变量一样被传递或使用,这与C语言的回调函数比较类似。不同的是, Go语言支持随时在代码里定义匿名函数

闭包:

l 基本概念

闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环境(作用域)。

l 包的价

闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言,这意味着不仅要表示数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到变量中作为参数传递给其他函数,最重要的是能够被函数动态创建和返回。

l Go语言中的闭包

Go语言中的闭包同样也会引用到函数外的变量。闭包的实现确保只要闭包还被使用,那么被闭包引用的变量会一直存在

参考如下代码closure.go

package main
import ("fmt"
)
func main() {var j int = 5a := func()(func()) {var i int = 10return func() {fmt.Printf("i, j: %d, %d\n", i, j)}}()a()j *= 2a()
}