函数是指一段可以直接被另一段程序或代码引用的程序或代码,在Go语言中,函数是它的构成语言构成之一
函数的格式
func 函数名([参数列表])([返回参数列表]){ 代码块 }
[ ]在这里,表示的是可选的意思
有名函数
无参、无返回值函数
package main
import "fmt"
func test(){
fmt.Println("我是无参数,无返回值的函数")
}
func main() {
test()
}
//输出:我是无参数,无返回值的函数
上面创建了一个名为test的函数,test()括号中,没有一个参数在里面,也就是无参,test()后面没有参数,也就是没有返回值,如果有返回值,是什么样子,看下面的例子。
有参,无返回值函数
package main
import "fmt"
func testAdd(a int, b int){
sum := a + b
fmt.Println("我是有参数,无返回值的函数,这两个参数相加为:", sum)
}
func main() {
testAdd(10, 30)
}
//输出:我是有参数,无返回值的函数,这两个参数相加为: 40
这里创建了一个函数 testAdd,在testAdd()中,我们给了两个参数,分别是 a,b它们的类型是 int类型,所以我们在调用它的时候,需要分别给这两个位置传进去 int类型的变量或者常量,上面我们传进去了两个数,分别是 10和30,然后运行,输出了它们的和40
有参、有返回值
一个返回值的情况
package main
import "fmt"
func testAdd(a int, b int) (sum int){
fmt.Println("我是有参数,有返回值的函数")
sum = a + b
return sum
}
func main() {
sum := testAdd(10, 30)
fmt.Println("调用testAdd()函数后,它返回来的值为:", sum)
}
//输出:我是有参数,有返回值的函数
// 调用testAdd()函数后,它返回来的值为: 40
基于前一个例子,我们改造了下 testAdd()函数,在这个函数中,添加了个名为 sum,类型为int的返回值,然后把函数内执行后的内容,返回给了调用 testAdd()函数的main()函数,不过返回的类型必须跟你规定的返回类型一样,也就是int
注:在这里,如果你只有一个返回类型并且没有给这个返回类型指定变量名的话,可以不写括号的;如果你有给返回类型指定了变量还去掉括号的话,就会报错
func testAdd(a int, b int) int{
fmt.Println("我是有参数,有返回值的函数")
sum := a + b
return sum
}
多个返回值的情况
package main
import "fmt"
func testAdd(a int, b int) (int, int, int){
fmt.Println("我是有参数,有返回值的函数")
sum := a + b
return a, b, sum
}
func main() {
a, b, sum := testAdd(10, 30)
fmt.Println("调用testAdd()函数后,它返回来的值为:", a, b, sum)
}
我们还是基于上面,把这个函数改造了,不过这时候,我们没有给任何一个返回值起变量名,我们重点要看的是,调用了这个函数后返回的值,需要怎么接收处理,从 testAdd()函数的 return语句可以看出,我们分别把函数调用传进来的值都给返回去了(这不是必须的,我只是不想多创建两个int类型的值返回去而已),还把两个的值的和作为返回值返回了。这里你要注意一下,它返回的内容的顺序,这样才知道要怎么处理这些返回值。
注意:这个多值返回,可以给它们取一个变量名,不过我这并没有这么做而已
把有名函数当做变量赋值
package main
import "fmt"
func testAdd(a int, b int) (int, int, int){
sum := a + b
return a, b, sum
}
func main() {
function := testAdd
a, b, sum := function(10, 30)
fmt.Println("调用function()函数后,它返回来的值为:", a, b, sum)
}
//输出:调用function()函数后,它返回来的值为: 10 30 40
从上面的代码可以看出,我们直接把变量名赋值给了一个新的变量,赋值后,这个变量的类型,就变成跟 testAdd()函数的类型一样了,你们可以用格式化打印出它们两个的类型,我给你们一个打印好的内容,如下
func(int, int) (int, int, int)
这里打印的这个,是 testAdd的函数类型,也叫做函数签名,还是一个比较重要的东西
package main
import "fmt"
func testAdd(a int, b int) (int, int, int){
sum := a + b
return a, b, sum
}
func testSub(a int, b int) (int, int, int){
result := a - b
return a, b, result
}
func main() {
fmt.Printf("testAdd()函数的类型是:%T \n", testAdd)
fmt.Printf("testSub()函数的类型是:%T", testSub)
}
//输出:testAdd()函数的类型是:func(int, int) (int, int, int)
//testSub()函数的类型是:func(int, int) (int, int, int)
看到没,函数名不同,但输出的函数类型是一样的,其实在Go中,你只要参数还有返回值的个数、顺序还有类型都相同的话,就算是函数签名一样了
匿名函数
直接赋值给函数变量
package main
import "fmt"
func main() {
sum := func(a int, b int) int {
return a + b
}
fmt.Printf("sum的类型为:%T\n", sum)
//使用匿名函数
fmt.Println("调用sum之后的输出为:", sum(10, 30))
}
//输出:
//sum的类型为:func(int, int) int
//调用sum之后的输出为: 40
另一种使用匿名函数的方法
package main
import "fmt"
func main() {
sum := func(a int, b int) int {
return a + b
}(10, 20)
fmt.Println("匿名函数 func的输出为:", sum)
}
//输出:匿名函数 func的输出为: 30
我们直接写一个匿名函数后,在{ }后面添加个(),把你要多少个参数传递进去,然后接收这个匿名函数的返回值即可(前提是这个匿名函数有返回值)
函数的返回类型是函数
package main
import "fmt"
func testReturnIsFunc() func(a int, b int) int{
return func(a int, b int) int {
return a + b
}
}
func main() {
returnFunc := testReturnIsFunc()
sum := returnFunc(10, 30)
fmt.Printf("returnFunc的类型为:%T\n", returnFunc)
fmt.Printf("sum的类型为:%T\n", sum)
fmt.Println("最后返回的值为:", sum)
}
//输出:
//returnFunc的类型为:func(int, int) int
//sum的类型为:int
//最后返回的值为: 40
我们创建了一个 testReturnFunc的无参函数,它的返回值是一个函数 func(a int , b int) int,而且这个返回值函数,还有个返回值,那么我们在调用它的时候,要怎么做呢?
我们先调用 testReturnFunc()函数,然后返回了一个函数,我们把这个函数赋值为函数变量,再调用这个函数变量,把需要的值传递进去,最终得到需要返回的函数的返回值,如上面的代码所见
不定参数的函数
有时候,我们需要传递很多个参数给别的函数,而且具体是多少个我们不是很确定,如果写多、写少都很不好。这时候我们可以用到Go语言给我们提供的不定参数
格式
func 函数名(参数名...参数类型)([返回值类型]){代码块}
注:这里的 ... 是必须的
代码实现
package main
import "fmt"
func sum(args...int) int {
var result int = 0
for index, val := range args{
fmt.Printf("第%v个值,这个数为:%v \n",index ,val)
result = result + val
}
return result
}
func main() {
result := sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
fmt.Println("最后的结果为:", result)
}
输出,这里用的是 for-range去输出内容
第0个值,这个数为:1
第1个值,这个数为:2
第2个值,这个数为:3
第3个值,这个数为:4
第4个值,这个数为:5
第5个值,这个数为:6
第6个值,这个数为:7
第7个值,这个数为:8
第8个值,这个数为:9
第9个值,这个数为:10
最后的结果为: 55
结尾处
注:在Go语言中,如果变量名首字母大写,即代表着是个公有的变量;如果是变量首字母小写,代表着这个变量是私有的,函数名也跟变量一样的规则。
至于什么是公有、私有,这个其实就是控制变量的访问范围
欢迎大家关注下个人的「公众号」:独醉贪欢