当前位置:网站首页>【Gopher 学个函数】边学边练,简单为 Go 上个分
【Gopher 学个函数】边学边练,简单为 Go 上个分
2022-08-03 00:15:00 【梦想橡皮擦】
️ 实战场景
今天我们要完成的核心内容是 Go 函数的学习,Go 中支持普通函数,匿名函数和闭包函数,对于学过 Python 的同学来说,都不是新鲜概念。
首先接触的依旧是普通函数的使用,在 Go 中,函数的基本组成有 func 关键字,函数名,参数列表,函数体,返回值几个部分。
转换成语法格式如下所示:
func 函数名(形参列表)(返回值类型){
函数体
}
从语法格式尚,可以看出一个与 Python 比较大的差异,就是形参列表后跟了返回值类型列表,当然该值非必须,毕竟有些场景下的函数是不需要返回值的。
接下来我们就编写一个简单的函数,其实现的需求是:传入一个名称 name,返回格式化的语句,代码如下:
package main
import "fmt"
func format(name string) string {
var ret string
ret = fmt.Sprintf("传入的参数值是,%s", name)
return ret
}
func main() {
ret := format("橡皮擦")
fmt.Println(ret)
}
还是要记住第一篇博客我们就涉及的知识点,Go 语言最少有 1 个 main() 函数,而且还要注意 main() 函数无参数和返回值。
如果希望函数有多个返回值,仅需要在函数声明时,初始化多个返回类型即可。
package main
import "fmt"
func format(name string) (string, int) {
var ret string
ret = fmt.Sprintf("传入的参数值是,%s", name)
return ret, 18
}
func main() {
ret, age := format("橡皮擦")
fmt.Println(ret)
fmt.Println(age)
}
️ 其它实践
在 Go 中不支持重载,而且一个包不能有两个名字一样的函数,例如下述代码是错误的。
func format(name string) (string, int) {
var ret string
ret = fmt.Sprintf("传入的参数值是,%s", name)
return ret, 18
}
func format() {
fmt.Print("重载函数")
}
Go 的返回值,可以不指定内容,即下述代码:
package main
import "fmt"
func add(a, b int) (c int) {
c = a + b
return
}
func main() {
c := add(1, 2)
fmt.Println(c)
}
上述代码的写法就非常有趣,在函数首行声明时,直接指定了返回变量很返回值类型,使用 return 语句即可直接返回对应值,多个返回值也可以使用该写法。
package main
import "fmt"
func add(a, b int) (c, d int) {
c = a + b
d = a
return
}
func main() {
c, _ := add(1, 2)
fmt.Println(c)
}
以上代码展示了多个变量返回,并且使用标识符 _ 忽略了第二个返回值。
由于函数也是一种类型,所以函数也可以赋值给任意变量,具体代码如下所示:
package main
import "fmt"
func add(a, b int) int {
return a + b
}
func main() {
c := add // 函数赋值给变量
sum := c(1, 2)
fmt.Println(sum)
}
️ Go 匿名函数
在 Go 语言中,匿名函数是由一个不带函数名的函数声明和函数体组成,其语法格式如下所示:
func (参数列表)(返回参数列表){
函数体
}
从语法格式也能发现,仅缺少函数名。
接下来我们进行二种实践,其一是在匿名函数声明之后,直接使用,其二是将匿名函数赋值给变量使用。
匿名函数直接使用
package main
import "fmt"
func main() {
func(a, b int) {
fmt.Println("匿名函数", a, b)
}(1, 2)
}
需要注意匿名函数如果直接使用,要在其它函数内部调用,其不能单独成一块代码存在。
匿名函数赋值给变量
匿名函数声明完毕,可以将其赋值给任意变量,后续该变量等同于该函数。
package main
import "fmt"
func main() {
add := func(a, b int) int {
return a + b
}
ret := add(1, 2)
fmt.Print("匿名函数的使用,返回值是", ret)
}
你正在阅读 【梦想橡皮擦】 的博客
阅读完毕,可以点点小手赞一下
发现错误,直接评论区中指正吧
橡皮擦的第 703 篇原创博客
从订购之日起,案例 5 年内保证更新
边栏推荐
- 十年架构五年生活-03作为技术组长的困扰
- 2022 开放原子全球开源峰会 | 麒麟信安携手openEuler助力开源产业繁荣发展
- fifa将采用半自动越位技术计算进球
- 科捷智能冲刺科创板:年营收12.8亿 顺丰与日日顺是股东
- Auto.js special positioning control method cannot perform blocking operations on the ui thread, please use setTimeout instead
- NVM和NRM
- 2022 China Eye Expo, Shandong Eye Health Exhibition, Vision Correction Instrument Exhibition, Eye Care Products Exhibition
- alibaba数据同步组件canal的实践整理
- esp32和ros2基础篇草稿-micro-ros-
- 并查集总结
猜你喜欢

Auto.js special positioning control method cannot perform blocking operations on the ui thread, please use setTimeout instead

文树勋率长沙市人大常委会主任会议成员莅临麒麟信安调研数字经济发展情况

【系统架构设计师】第三章 数据库系统

「PHP基础知识」隐式数据类型

年近30 ,4月无情被辞,想给划水的兄弟提个醒...

电压传感器: 工作原理、类型及电路图

为了面试阿里,熬夜肝完这份软件测试笔记后,Offer终于到手了

ASP.NET网络版进销存管理系统源码【源码免费分享】

【多线程】线程与进程、以及线程进程的调度

机器学习-特征映射方法
随机推荐
Flink / Scala - 使用 CountWindow 实现按条数触发窗口
十二、form表单的提交
嵌入式分享合集26
D experimental new anomaly
2022 开放原子全球开源峰会 | 麒麟信安携手openEuler助力开源产业繁荣发展
UE5 官方案例Lyra 全特性详解 8.如何用配置表初始化角色数据
公司招个程序员,34岁以上两年一跳的不要,开出工资以为看错了
SAP 电商云 Spartacus UI 的持续集成 - Continous integration
【多线程】Thread类的基本用法
7.29
DataGuard日常维护常见问题之数据同步异常
Canonical correlation analysis of CCA calculation process
写一个简单的网站步骤
【TypeScript笔记】01 - TS初体验 && TS常用类型
[NCTF2019]SQLi-1||SQL注入
全栈----跨域
Day017 封装
程序员英语自我介绍
服务间歇性停顿问题优化|得物技术
中科磁业IPO过会:年营收5.5亿 吴中平家族持股85%