Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Golang语言社区--Go语言基础第六节函数

Golang语言社区--Go语言基础第六节函数

原创
作者头像
李海彬
发布于 2018-03-08 12:01:51
发布于 2018-03-08 12:01:51
9600
举报
文章被收录于专栏:Golang语言社区Golang语言社区

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

函数定义

函数声明语句:

代码语言:go
AI代码解释
复制
function 函数名(参数列表) (返回值列表) {
    // 函数体
}

注意:

1、  参数列表和返回值列表都是变量名在前,变量类型在后;

2、  Go函数支持多返回值,但并不是所有返回值都必须赋值,在函数返回时没有被明确赋值的返回值都会被设置为默认值。

3、  函数左起的花括号”{”不能另起一行,否则会报错;

 以一个简单的计算加法的函数为例:

代码语言:go
AI代码解释
复制
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
}

如果参数列表中若干个相邻的参数类型相同,则可以在参数列表中省略前面变量的类型声明,例如:

代码语言:go
AI代码解释
复制
func add(a, b int) (ret int, err error) {
  ...
}

如果返回值列表中多个返回值的类型相同,也可以用同样的方式合并;另外,如果函数只有一个返回值,可以这样写:

代码语言:go
AI代码解释
复制
func Add(a, b int) int {
  ...  
}

Go语言支持多重赋值,比如:

代码语言:go
AI代码解释
复制
i, j = j, i

用于交换两个变量的值,在不支持多重赋值的语言中,交换两个变量的内容需要引入一个临时变量:

代码语言:go
AI代码解释
复制
t = i; i = j; j = t

Go函数带回多个返回值时,可以使用多重赋值语句,将不同的返回值赋值给不同的变量,并且允许使用匿名变量("_")接受不需要使用的返回值,例如:

代码语言:go
AI代码解释
复制
func GetName() (firstName, lastName, nickName string) {
    return "May", "Chan", "Chibi Maruko"
}

_, _, nickName := GetName

函数调用

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

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

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

不定参数

例如:

代码语言:go
AI代码解释
复制
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
AI代码解释
复制
func Printf(format string, args ...interface{}) {
    ...
}

例如:

代码语言:go
AI代码解释
复制
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
AI代码解释
复制
f := func(x, y int) int {
    return x+y
}

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

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

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

代码语言:go
AI代码解释
复制
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是建立在同一个函数上,但作用在同一个局部变量的不同实例上的两个不同的闭包。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Golang语言社区--Go语言基础第七节函数调用等
大家好,我是Golang语言社区主编彬哥,本篇给大家带来的是关于Go语言中的函数调用相关。
李海彬
2018/03/14
9150
Golang语言社区--Go语言基础第七节函数调用等
学习go语言编程之函数
函数的基本组成:关键字func,函数名,参数列表,返回值,函数体,返回语句。 示例如下:
编程随笔
2023/10/15
1880
golang教程
这里有两个关键点。 - 其一是defer关键字。defer语句的含义是不管程序是否出现异常,均 在函数退出时自动执行相关代码。 - 其二是Go语言的函数允许返回多个值。
陨石坠灭
2018/10/19
1.7K0
golang教程
Go 语言基础入门教程 —— 函数篇:函数的基本定义和调用
几乎所有编程语言都支持函数,编写函数的目的在于将复杂的问题分解为一系列简单的任务来处理,此外同一个函数还可以被多次复用,这一结构在面向过程的函数式编程中至关重要。同为类 C 语言,Go 语言的函数和 PHP 函数的基本结构差不多,只是具体细节有所差异,在 Go 语言中,函数的基本组成为:关键字 func、函数名、参数列表、返回值、函数体和返回语句,作为强类型语言,无论是参数还是返回值,在定义函数时,都要声明其类型。
学院君
2019/08/08
5450
Go语言入门——基础语法篇(二)
Go的语句是可以省略;结束符的,且每行尽可能只写一句代码,这是Go语言的编程范式,因此应遵循规范,不要加分号。分号只在一种情况下是必须的,当一行写了多个代码语句,则每个语句必须使用分号分隔。
arcticfox
2019/08/02
7700
Go语言入门——基础语法篇(二)
09.Go语言-函数
函数 是基于功能或逻辑进行封装的可复用的代码结构。将一段功能复杂、很长的一段代码封装成多个代码片段(即函数),有助于提高代码可读性和可维护性。由于 Go 语言是编译型语言,所以函数编写的顺序是无关紧要的。
面向加薪学习
2022/09/04
4140
Go语言编程设计学习Day1:helloworld 变量 常量
简单了解一下go语言的历史, 二十世纪八十年代,肯·汤普逊在内的Plan 9项目原班人马加入了谷歌在Google,他们创造了Go语言。早在2007年9月,Go语言还是这帮大牛的20%自由时间 的实验项目。幸运的是,到了2008年5月,Google发现了Go语言的巨大潜力,从而开始全力支持 这个项目,让这批人可以全身心投入Go语言的设计和开发工作中。Go语言的第一个版本在2009 年11月正式对外发布,并在此后的两年内快速迭代,发展迅猛。第一个正式版本的Go语言于2012 年3月28日正式发布,让Go语言迎来了第一个引人瞩目的里程碑。
冷环渊
2022/12/16
5250
Go语言编程设计学习Day1:helloworld 变量 常量
【Go 基础篇】Go语言匿名函数详解:灵活的函数表达式与闭包
在Go语言中,函数是一等公民,这意味着函数可以像其他类型的值一样被操作、传递和赋值。匿名函数是一种特殊的函数,它没有固定的函数名,可以在代码中被直接定义和使用。匿名函数在Go语言中具有重要的地位,它们常用于实现闭包、函数式编程和并发编程等领域。
繁依Fanyi
2023/10/12
8960
【Go 基础篇】Go语言匿名函数详解:灵活的函数表达式与闭包
夯实基础:Go 语言匿名函数和闭包的应用实践
前面的文章主要介绍了 Go 语言中函数声明和参数传递。本文将会继续介绍匿名函数和闭包相关的概念以及使用方法。
aoho求索
2021/09/02
9550
Go基础——function函数
我们以写一个计算商品价格的函数为例,输入参数是单件商品的价格和商品的个数,两者的乘积为商品总价,作为函数的输出值。
羊羽shine
2019/05/28
6740
Go 专栏|函数那些事
曾经很长一段时间,我都为自己是互联网科技公司的一员而感到自豪,我觉得我们与众不同。
AlwaysBeta
2021/09/07
1810
Go 专栏|函数那些事
Go语言入门(四)Map&函数
map&函数 map类型 map的申明和定义 map是一个key-value的数据结构,是引用类型的数据结构,需要初始化 初始化的时候容量可以定义,也可以不定义 map必须初始化才能使用,否则会panic var a map[key的类型]value的类型 func defineMap() { var user map[string]int = make(map[string]int) user["abc"] = 38 fmt.Printf("user:%v\n",user) a :
alexhuiwang
2020/09/24
4880
【转】Go 语言函数
Go 语言标准库提供了多种可动用的内置的函数。例如,len() 函数可以接受不同类型参数并返回该类型的长度。如果我们传入的是字符串则返回字符串的长度,如果传入的是数组,则返回数组中包含的函数个数。
yiduwangkai
2019/09/17
6940
Go 编程 | 连载 15 - Go 语言的函数
Go 语言中 函数 也是一种数据类型,有内存地址,且未被初始化的函数的值为 nil。
RiemannHypothesis
2022/09/28
9230
Go 语言基础入门教程 —— 函数篇:匿名函数和闭包
熟悉 Laravel 框架(一个 PHP Web 框架)的同学对匿名函数应该很熟悉,Laravel 框架中有着大量匿名函数的应用场景,比如路由定义、绑定实现到接口等:
学院君
2019/08/08
1.1K0
Go语言基础速刷手册
这个“不务正业”的阿巩,今天冒着现学现卖的风险来和大家分享Go了,作为既具备C的理念又有Python 姿态的语言,怎么能不来试上一试呢!
才浅Coding攻略
2022/12/12
9150
7.Go函数
我想问一下大家,在大家小时候有没有玩过超级玛丽这个游戏?有同学说玩过,这确实是一款非常经典的游戏。
Devops海洋的渔夫
2022/01/17
3880
7.Go函数
Go语言入门——函数
使用struct去定义自己想要的数据模型就好比定义一个Java中的model一样……
JackieZheng
2019/07/02
4890
Golang笔记之变量
package main // 关键字var 声明变量 类型信息放在变量名后 //声明一个int型变量 var v1 int //声明一个string类型 var v2 string //声明多个变量 var v3, v4 bool //[0 0 0 0 0 0 0 0 0 0] 数组 var v5 [10]int //数组切片 var v6 []int //声明结构体 var v7 struct { f int } // 声明指针 var v8 *int //声明map key为
超蛋lhy
2018/08/31
3590
GO语言基础
golang可执行程序, package main,并且有且只有一个main入口函数
用户9645905
2023/10/27
2420
GO语言基础
相关推荐
Golang语言社区--Go语言基础第七节函数调用等
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档