当前位置:网站首页>Golang学习之路(五):Golang的函数
Golang学习之路(五):Golang的函数
2022-08-09 11:54:00 【曲鸟】
一、函数
1. 语法
func 函数名( [参数] ) [返回值类型] {
函数体
}
2. 值传递
默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。
1)求a和b两个参数值之和:
package main
import "fmt"
func main() {
result :=sum(1, 2)
fmt.Println("a+b之和为:",result)
}
func sum(a, b int) int {
return a+b
}
输出结果
a+b之和为: 3
2)Golang的函数返回值可以为多个:
package main
import "fmt"
func main() {
res1,res2 :=fuc(1, 2)
fmt.Println(res1,res2)
}
func fuc(a, b int) (int,int) {
return a+b,a-b
}
输出结果
3 -1
3)也可以无返回值:
package main
import "fmt"
func main() {
fuc(1, 2)
}
func fuc(a, b int) {
fmt.Println("传入的值为:",a,b)
}
输出结果
传入的参数为: 1 2
3. 引用(指针)传递
引用传递是将参数的内存地址传递到函数中,如果在函数中对该参数值进行了修改,那外层的该参数值也会被修改。
举例说明
现在定义一个函数接受一个参数a,在打印a的值后将a赋值为3
下面是值传递的写法:
package main
import "fmt"
func main() {
a :=1
fuc(a)
fmt.Println("值未被修改,还是为:",a)
}
func fuc(a int) {
fmt.Println("传入的值为:",a)
a=3
}
输出结果
传入的值为: 1
值未被修改,还是为: 1
下面是引用传递的写法:
package main
import "fmt"
func main() {
a :=1
fuc(&a)
fmt.Println("值被修改了,由1变为了:",a)
}
func fuc(a *int) {
fmt.Println("传入的值为:",*a)
*a=3
}
输出结果
传入的值为: 1
值被修改了,由1变为了 3
二、函数用法
1. Golang中没有class
要知道的是,Golang中并没有Python、Java中的类(class)。Golang一切的一切都是函数,如果要实现一个class的话,可以这样写:
package main
import (
"fmt"
"strconv"
)
// Test 等于声明一个类
type Test struct {
name string
age int
}
func (tes *Test) print() string{
return "我的名字是:"+tes.name+",我的年龄为:"+strconv.Itoa(tes.age)
}
func main() {
obj := &Test{
"曲鸟",18} //初始化并赋值
b := obj.print()
fmt.Println(b)
}
输出结果
我的名字是:曲鸟,我的年龄为:18
类中函数带参数的写法:
func (tes *Test) sum(a,b int) string{
//求a+b的和
return "a+b="+strconv.Itoa(a+b)
}
func main() {
obj := &Test{
"曲鸟",18}
b := obj.sum(3,3)
fmt.Println(b)
}
2. 闭包
闭包可以理解为“定义在一个函数内部的函数“,闭包是一座用于连接函数内部和函数外部的桥梁
对于上面的第一个例子(输出结果如下):
我的名字是:曲鸟,我的年龄为:18
使用闭包可以这样写:
package main
import (
"fmt"
"strconv"
)
func add(name string, age int) func() string {
return func() string {
//相当于下面main中的obj
return "我的名字是:" + name + ",我的年龄为:" + strconv.Itoa(age)
}
}
func main() {
obj := add("曲鸟", 18)
fmt.Println(obj())
}
3. Golang中函数传递函数
Golang可以将函数作为变量的值
package main
import (
"fmt"
)
func add9(a int) int {
//
return a+9
}
func main(){
a := func(x int) int {
//将该函数赋值给a
return add9(6)
}
fmt.Println("a+9的值为:",a(9))
}
输出结果
a+9的值为: 15
边栏推荐
- [Interview high-frequency questions] Linked list high-frequency questions that can be gradually optimized
- redis库没法引入
- redis内存的淘汰机制
- 全面了解什么是TPS、QPS以及两者的区别
- Double pointer - the role of char **, int **
- 【Basic model】Transformer-实现中英翻译
- mysql8.0和navicat premium15下载安装
- PAT1008
- electron 应用开发优秀实践
- 太卷了... 腾讯一面被问到内存满了,会发生什么?
猜你喜欢
[Interview high-frequency questions] Linked list high-frequency questions that can be gradually optimized
Shell之常用小工具(sort、uniq、tr、cut)
matlab simulink的scope 示波器光标如何移动记录
Programmer's Exclusive Romance - Use 3D Engine to Realize Fireworks in 5 Minutes
【Data augmentation in NLP】——1
wpf实现简易画板功能(带截取画板,签名截图等等)
问题来了:4GB物理内存的机器上申请8G内存能成功吗?
结构体变量的首地址获取注意事项
2022 全球 AI 模型周报
LeetCode热题(11.合并两个有序链表)
随机推荐
Semaphore SIGCHLD use, how to make the parent that the child performs over, how to make the distinction between multiple child processes. The end
Summary of learning stages (knapsack problem)
Web console control edit box
HAproxy:负载均衡
2022 全球 AI 模型周报
WPF 实现带蒙版的 MessageBox 消息提示框
MySQL查询性能优化七种武器之索引潜水
索引index
C# async 和 await 理解
IDEA 关闭/开启引用提示Usages
程序员的专属浪漫——用3D Engine 5分钟实现烟花绽放效果
【重要】C语言进阶 -- 自定义类型:结构体、枚举、联合
电解电容漏电流及均压
[现代控制理论]3_Phase_portrait 相图 相轨迹
JS 封装节流(后期优化)
Redis的下载安装
[现代控制理论]2_state-space状态空间方程
微信支付开发流程
Redis的常用数据结构和底层实现方式
Gumbel_Softmax 概要