旅游网站建设资金请示,dw中网站统计总访问量怎么做,网站建设前期目标,福建福州罗源建设局网站一次5-10分钟即可搞定#xff0c;以干货效率的学习方式带你更直观的玩转各种玩法#xff01; 行文不易#xff0c;一字一句纯手打创造#xff0c;倾注了不少精力#xff0c;感谢支持。 目录
什么是函数#xff1f;有哪些元素#xff1f;
函数参数、返回值
小程序以干货效率的学习方式带你更直观的玩转各种玩法 行文不易一字一句纯手打创造倾注了不少精力感谢支持。 目录
什么是函数有哪些元素
函数参数、返回值
小程序函数与函数调用各种玩法举一反三
函数参数与值传递说明 什么是函数有哪些元素 函数是一个基本的代码块可以让每个函数代表一个基本职能或者说定义要做的功能或任务
一个完整的go程序中至少有个main函数单个函数可声明函数名称、参数列表、返回值列表定义函数需要用func关键字。
同时go中的函数也是一个变量可以在函数内继续定义函数。
其中init和main这两个内置函数的作用功能在前面讲解包时已充分说明这里不再赘述哦 函数参数、返回值
下面我们快速看一下函数的组成和表示
// 示例1
func funcName(a int, b string) (string, int) {// 函数体return ,0
}【说明】
函数名称funcName
参数列表两个参数分别是a、b,类型分别为int、string
返回值列表两个返回值类型分别为string、int且没有定义返回值名称// 示例2
func funcName(a,b int) (sum int) {// 函数体return
}【说明】
函数名称funcName
参数列表两个参数分别是a、b,类型都为int类型
返回值列表单个返回值定义为sum变量为int类型
函数的参数用来做输入条件返回值用来返回结果。
以一个常见的过程说明该模型你要计算ab的和假设abc那我们这个函数要做的就是计算两数之和返回的结果就是计算所得的和而函数的参数就是a和b也就是输入的条件得告诉函数要以什么为条件让它去执行。当然。参数列表和返回值列表也都可以不设置。 小程序函数与函数调用各种玩法举一反三
下面写一个简单程序来认识一下函数到底怎么定义和使用。
程序完成求和、求积两个职能下面我们根据实际含义定义两个函数
// 两数之和
func add(a, b int) int {return a b
}// 两数之积
func multiply(a, b int) int {return a * b
}在main中调用并打印结果
import fmtfunc main() {var a, b 1, 2// 求ab的和r1 : add(a, b)fmt.Printf(ab %v\n, r1)// 求a*b的积r2 : multiply(a, b)fmt.Printf(a*b %v\n, r2)
}
这样就完成了函数调用和返回值的接收结果
ab 3
a*b 2
另外如果add函数我不想定义在外面只想在本程序中唯一使用也可以这么玩
func main() {var a, b 1, 2add0 : func(a, b int) int {return a b}// 求ab的和r1 : add0(a, b)fmt.Printf(ab %v\n, r1)// 求a*b的积r2 : multiply(a, b)fmt.Printf(a*b %v\n, r2)
}// 两数之积
func multiply(a, b int) int {return a * b
}
可以看到在要求和的上方直接定义了一个函数add0并且在接下来完成了调用结果效果和上面完全一致。
当然你觉得函数只有在这一个地方用到为什么还要写函数名让我直接调用岂不更简单当然可以咱们这么玩 var a, b 1, 2// 求ab的和r1 : func(a, b int) int {return a b}(a, b)fmt.Printf(ab %v\n, r1)
r1就是对a、b求和的结果效果也是完全一样注意这个示例中func后的a、b也是函数参数实际输入的1和2这两个参数是通过函数后的小括号传进去的这个就是实际参数而func后的a、b是形式参数也叫形参。
同时在这个案例中该func就是一个匿名函数即没有名称的函数。 函数参数与值传递说明
值得注意的是go中主要是值传递并没有引用传递所谓值传递就是形式参数是对应值的一个副本传的并不是值本身。
假设我们有这样一个需求函数updateNum修改输入参数n的值将值恒定改为1分为两种返回修改的结果、不返回修改的结果 func updateNum (n int) int{n 1return n // 实际这里直接return 1就行了但为了看起来更明白因此多此一举加了n 1
}func updateNum (n int){n 1
}要说明的是返回结果这种情况只要调用方去接收函数的返回值则接收到的必定是1因此没有悬念这种严格说算不上修改返回值而是直接返回了1下面重点看看第二种 n : 10fmt.Printf(n%d\n, n)updateNum(n)fmt.Printf(n%d\n, n)
上面提到go中默认是值传递因此传入updateNum的参数为n的副本函数只是传入了10而已n本身还是n函数内部所做的n1实际修改的是函数的形参的值外界的n不受影响因此修改前后打印的n结果都是10。
那怎样才能让这个函数成功的修改了n呢答案就是指针给函数参数传递n的地址即可
func main() {n : 10fmt.Printf(n%d\n, n)updateNum(n)fmt.Printf(n%d\n, n)
}func updateNum(n *int) {*n 1
}
这样修改为什么能成功原因就是传入了n的地址通过地址修改了变量内存地址对应的值修改后外界会一同修改因此在调用结束函数后再次打印n就变成了1。这实际就是其它语言中听到的引用传递。
在后续熟悉了其它引用类型后这会变得更加有趣
到这里相信你对函数的使用和玩法也有了一个清晰的认识啦。 在后续熟悉了引用类型及指针结合并逐渐加深后也可以阅读这篇不包含在本文范畴内目前阶段暂不必须
关于go语言指针/指针指向的全面分析
来进一步加强这方面的全面理解。