前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang语言社区--Go语言基础第七节函数调用等

Golang语言社区--Go语言基础第七节函数调用等

原创
作者头像
李海彬
发布2018-03-14 20:29:49
9020
发布2018-03-14 20:29:49
举报
文章被收录于专栏:Golang语言社区

大家好,我是Golang语言社区主编彬哥,本篇给大家带来的是关于Go语言中的函数调用相关。

函数调用非常方便,只要事先导入该函数所在的包,就可以调用了:

代码语言:go
复制
import "mymath"
c := mymath.Add(1,2)

注意:小写字母开头的函数只在本包内可见,大写字母开头的函数才能被其它包使用。

不定参数

例如:

代码语言:go
复制
func foo(args ...int) {  // 接受不定数量的参数,这些参数都是int类型
    for _, arg := range args {
        fmt.Println(arg) 
    }
}

foo(2,3,4)
foo(1,3,7,13)   

形如"...type"格式的类型只能作为函数的参数类型存在,并且必须是最后一个参数。

"...type"本质上是一个数组切片,也就是[]type,这也是为什么上面的参数args可以用for循环来获得每个传入的参数。

如果希望不定参数传任意类型,可以指定类型为interface{},如标准库中的fmt.Printf()的函数原型:

代码语言:go
复制
func Printf(format string, args ...interface{}) {
    ...
}

例如:

代码语言:go
复制
func foo(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 float32:
                fmt.Println(arg, "is a float32 value.") 
            default:
                fmt.Println(arg, "is an unknown type.") 
        }
    }
}

匿名函数与闭包

匿名函数可以直接赋值给一个变量,例如:

代码语言:go
复制
f := func(x, y int) int {
    return x+y
}

或者直接执行一个匿名函数:

代码语言:go
复制
func(ch chan int) {
    ch <- ACK
} (reply_chan)    // 花括号后面直接跟参数列表表示函数调用

闭包:当一个函数内部嵌套另一个函数定义时,内部的函数体可以访问外部函数的局部变量。

代码语言:go
复制
a := func() (func()) {
    var i int = 10 
    return func(){
        fmt.Printf("i=%d\n", i)
        i++
    }
}

c1 := a() 
c2 := a() 
c1()        // 10
c1()        // 11
c1()        // 12
c2()        // 10

c1和c2是建立在同一个函数上,但作用在同一个局部变量的不同实例上的两个不同的闭包。


错误处理

Go语言引入了一个错误处理的标准模式,即error接口,该接口定义如下:

代码语言:go
复制
type error interface {
    Error() string
}

对于大多数函数,如果要返回错误,可以将error作为多返回值的最后一个:

代码语言:go
复制
func foo(param int)(ret int, err error)
{
  ...  
}

调用时的代码:

代码语言:go
复制
n, err := foo(0)
if err != nil {
    //  错误处理
} else {
    // 使用返回值n
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 不定参数
  • 匿名函数与闭包
  • 错误处理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档