- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
函数是基本的代码块,它的作用是可以将实现某个功能的多行代码封装到一段代码块中(即函数),在需要的时候去调用。同个函数可以被多次调用,实现代码重用。
函数一般会有参数和返回值(也可以没有),函数名称、函数参数、函数返回值以及它们的类型被统称为函数签名
在Go语言中,函数有以下一些特点:
Go函数定义格式如下:
func function_name ([parameter list]) [return_type]{
函数体
}
func
开始声明定义函数parameter list
:参数列表,一般格式为 param1 type1, param2 type2...
return_type
:返回值类型,这里可以只写返回值类型,也可以为返回值命名(即支持命名返回值参数的写法:ret1 type1
)Go函数被调用的时候,传入的参数会被复制然后传递到函数内部使用,即函数体中使用的是参数副本。这种方式也称之为值传递
&
符号)作为输入参数传递给函数(即引用传递)。此时传递的是地址的副本,但地址副本指向位置还是原来变量的位置,因此可以通过该指针来修改原来的变量。如果传递的是slice
、map
这类引用类型,它们默认都是采用引用传递return
多个返回值func main(){
r1, r2 := A(1, "A")
}
func A(a int, b string) (int, string) {
c := a + 1
d := b + "aa"
return c, d
}
func main(){
r3 := B(1, 2, 3)
}
func B(a, b, c int) int {
return a + b + c
}
return
后面也可以不写上返回值的名称,默认会返回函数声明中那几个命名的返回值func main(){
r4, r5, r6 := C()
}
func C() (a, b, c int) {
a, b, c = 1, 2, 3
return
}
...type
这样的形式来表示不定长变参,注意不定长变参只能作为最后一个参数。函数会接收一个某个指定类型的类似slice
的参数func main(){
r7 ;= D(0,1,2,3)
}
func D(base int , s ...int) int {
for _, v := range s {
base += v
}
}
这里小朋友是否有个问号:这种方式和你直接把参数放到一个slice
中,再直接传递这个slice
的方式有何区别?区别在于不定长变参是对原来的参数进行拷贝再放到slice中,因此函数内改变它们并不会改变原来的值,而直接传递slice
是引用传递,传递的是slice的指针,函数内改变会改变原来的值
func main(){
p := 1
G(&p)
fmt.Println(p)
}
func G(p *int) {
*p = 2
fmt.Println(*p)
}
func main(){
s := []int{1, 2, 3, 4}
F(s)
fmt.Println(s)
}
func F(s []int) {
s[0] = 5
s[1] = 6
s[2] = 7
s[3] = 8
fmt.Println(s)
}
func main(){
h := H
h()
}
func H() {
fmt.Println("H")
}
func main(){
r := f1(f2(5))
}
func f1(a,b,c int) int {
return a+b+c
}
func f2(a int) (b,c,d int){
b = a
c = a + 1
d = a - 1
return
}
type cb func(int) int
func main() {
testCallBack(1, callBack)
testCallBack(2, func(x int) int {
fmt.Printf("我是回调,x:%d\n", x)
return x
})
}
func testCallBack(x int, f cb) {
f(x)
}
func callBack(x int) int {
fmt.Printf("我是回调,x:%d\n", x)
return x
}
匿名函数,顾名思义即没有名字的函数。匿名函数不能独立地定义,它需要赋值给某个变量,即保存函数的地址到变量中,然后通过变量对函数进行调用。或者定义的同时直接调用
func main(){
i := func(){
fmt.Println("匿名函数赋值给变量再调用")
}
i()
func(){
fmt.Println("匿名函数直接调用")
}()
}
Go的匿名函数支持闭包。关于闭包的概念:
闭包函数:声明在一个函数中的函数,叫做闭包函数
闭包:闭包函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回之后
有关闭包更加深入的理解后面会考虑再写一篇文章来介绍。下面是一段展示闭包的代码,closure
函数中的匿名函数(闭包函数)可以访问到外部函数中的变量x
。程序输出的结果为11
和12
func main(){
f := closure(10)
fmt.Println(f(1))
fmt.Println(f(2))
}
func closure(x int) func(int) int {
return func(y int) int {
return x + y
}
}
defer
函数的作用类似于其它语言中的析构函数,它会在函数体执行结束后再执行,如果有多个defer
函数,它们按照调用顺序的相反顺序逐个执行
defer
函数允许将某些语句推迟到函数返回之前才执行defer
函数一般常用于释放某些已分配的资源,文件关闭,解锁,计时等操作defer
函数的使用:直接在函数前加上defer
关键字即可func main(){
for i := 0; i < 3; i++ {
defer fmt.Println(i) //将逆序输出 2 1 0
}
}
defer
经常可以用在异常恢复的代码块中,在Go中没有Java的try-catch
机制,它是使用panic-recover
模式来处理程序中发生的错误
panic
可以在任意地方引发,但recover
只有在defer
调用的函数中才有效recover
的defer
函数需要定义在发生panic
之前func main(){
beforePanic()
panicRecover()
afterPanic()
}
func beforePanic() {
fmt.Println("before panic")
}
//panic-recover
func panicRecover() {
defer func() {
if err := recover(); err != nil {
fmt.Println("Recover in this")
}
}()
panic("Panic !!!")
}
func afterPanic() {
fmt.Println("after panic")
}
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
介绍篇 什么是MiniApis? MiniApis的特点和优势 MiniApis的应用场景 环境搭建 系统要求 安装MiniApis 配置开发环境 基础概念 MiniApis架构概述
我正在从“JavaScript 圣经”一书中学习 javascript,但我遇到了一些困难。我试图理解这段代码: function checkIt(evt) { evt = (evt) ? e
package com.fastone.www.javademo.stringintern; /** * * String.intern()是一个Native方法, * 它的作用是:如果字
您会推荐哪些资源来学习 AppleScript。我使用具有 Objective-C 背景的传统 C/C++。 我也在寻找有关如何更好地开发和从脚本编辑器获取更快文档的技巧。示例提示是“查找要编写脚本的
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 想改善这个问题吗?更新问题,以便堆栈溢出为 on-topic。 6年前关闭。 Improve this
我是塞内加尔的阿里。我今年60岁(也许这是我真正的问题-笑脸!!!)。 我正在学习Flutter和Dart。今天,我想使用给定数据模型的列表(它的名称是Mortalite,请参见下面的代码)。 我尝试
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
学习 Cappuccino 的最佳来源是什么?我从事“传统”网络开发,但我对这个新框架非常感兴趣。请注意,我对 Objective-C 毫无了解。 最佳答案 如上所述,该网站是一个好地方,但还有一些其
我正在学习如何使用 hashMap,有人可以检查我编写的这段代码并告诉我它是否正确吗?这个想法是有一个在公司工作的员工列表,我想从 hashMap 添加和删除员工。 public class Staf
我正在尝试将 jQuery 与 CoffeScript 一起使用。我按照博客中的说明操作,指示使用 $ -> 或 jQuery -> 而不是 .ready() 。我玩了一下代码,但我似乎无法理解我出错
还在学习,还有很多问题,所以这里有一些。我正在进行 javascript -> PHP 转换,并希望确保这些做法是正确的。是$dailyparams->$calories = $calories;一条
我目前正在学习 SQL,以便从我们的 Magento 数据库制作一个简单的 RFM 报告,我目前可以通过导出两个查询并将它们粘贴到 Excel 模板中来完成此操作,我想摆脱 Excel 模板。 我认为
我知道我很可能会因为这个问题而受到抨击,但没有人问,我求助于你。这是否是一个正确的 javascript > php 转换 - 在我开始不良做法之前,我想知道这是否是解决此问题的正确方法。 JavaS
除了 Ruby-Doc 之外,哪些来源最适合获取一些示例和教程,尤其是关于 Ruby 中的 Tk/Tile?我发现自己更正常了 http://www.tutorialspoint.com/ruby/r
我只在第一次收到警告。这正常吗? >>> cv=LassoCV(cv=10).fit(x,y) C:\Python27\lib\site-packages\scikit_learn-0.14.1-py
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我是一名优秀的程序员,十分优秀!