3.2.9Golang的函数基础(函数,参数,返回值)

寒暄_HX · · 1148 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

总目录:https://www.jianshu.com/p/e406a9bc93a9

Golang - 子目录:https://www.jianshu.com/p/8b3e5b2b4497

函数

函数是组织好的、可重复使用的、用于执行指定任务的代码块。函数是go语言中的“一等公民”。

函数的定义与调用

其实我们从开始就无时无刻在接触着函数--main函数。

语法:
func 函数名(参数)(返回值){
函数体
}

规则:
函数名:由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名也称不能重名。
参数:参数由参数变量和参数变量的类型组成,多个参数之间使用,分隔。
返回值:返回值由返回值变量和其变量类型组成,也可以只写返回值的类型,多个返回值必须用 ()包裹,并用,分隔。
函数体:实现指定功能的代码块。

我们来写一个求两数加和的函数。

package main

import "fmt"

func sum(a int, b int) (ret int) {
    // 定义两个参数,参数类型是整型。
    // 同时指定返回值类型为int。
    return a + b
}

func main() {
    // 函数调用直接通过函数名调用,有参数传参数,有返回值接收返回值
    a := sum(3, 4)
    fmt.Println(a)
}
----------
7

同时go语言的函数定义也有很多不一样的点

package main

import "fmt"

// 有参数和返回值
func sum(a int, b int) (ret int) {
    // 定义两个参数,参数类型是整型。
    // 同时指定返回值类型为int。
    return a + b
}

// 没有返回值
func sum1(a int, b int) {
    // 没有返回值就不能用return语句
    fmt.Println(a + b)
}

// 没有参数和返回值
func sum2() {
    fmt.Println("随便打印点什么")
}

// 没有参数但是有返回值
func sum3()string {
    // 返回值可以直接写一个类型,表示这是一个什么返回值的函数
    sum3Ss := "没有参数但是有返回值"
    return sum3Ss
}

// 这样的写法是在函数初始化时就声明了一个返回值变量ret。
// 这种写法比较友好,因为别人一眼就可以看出来你返回了多少个,返回的都是什么
func sum4()(ret string) {
    ret = "没有参数但是有返回值"
    // 而且如果使用声明的返回值,return后面可以为空 默认返回我们定义的变量
    return 
}

// 既然有多个参数,那么也可以用多个返回值
func sum5()(age int , name string) {
    age = 18
    name = "张三" 
    return 
}


func main() {
    // 普通的调用
    a := sum(3, 4)
    fmt.Println(a)

    // 因为没有返回值,所以不能用变量接受函数
    sum1(3, 4)

    //因为没有参数也没有返回值,随便调用一下就可以
    sum2()

    // 有返回值没有参数的调用
    sum3Ss := sum3()
    fmt.Println(sum3Ss)

    // 有返回值没有参数的调用(第二种形式)
    sum4Ss := sum4()
    fmt.Println(sum4Ss)

    // 有多个返回值的调用
    sum5Age , sum5Name := sum5()
    fmt.Println(sum5Age,sum5Name)

}

----------
7
7
随便打印点什么
没有参数但是有返回值
没有参数但是有返回值
18 张三

参数

go语言没有默认参数这种说法。

参数简写

函数的参数中如果相邻变量的类型相同,则可以省略类型。
例如:

package main

import "fmt"

func sum(a, b int) (ret int) {
    return a + b
}

func main() {
    a := sum(3, 4)
    fmt.Println(a)
}
----------
7

他接受了两个整型的参数,那么可以少些一个int。

可变参数

可变参数是指函数的参数数量不固定。类似Python中的不定长参数。
Go语言中的可变参数通过在参数名后加...来标识。

package main

import "fmt"

// 可变参数
func intSum2(x ...int) int {
    fmt.Println(x) //x是一个切片
    sum := 0
    for _, v := range x {
        sum = sum + v
    }
    return sum
}

func main() {
    // 可变参数
    ret1 := intSum2(10,10,10)
    ret2 := intSum2(10,20)
    fmt.Println(ret1,ret2)
}
----------
[10 10 10]
[10 20]
30 30

同时固定参数也可以配合可变参数一起使用,但是可变参数要放在所有固定参数之后。

package main

import "fmt"

// 固定可变参数混搭
func intSum3(x int, y ...int) int {
    fmt.Println(x, y)
    sum := x
    for _, v := range y {
        sum = sum + v
    }
    return sum
}

func main() {
    // 固定可变参数混搭
    ret3 := intSum3(10,20,30)
    ret4 := intSum3(10,30,1,3,4)
    fmt.Println(ret3,ret4)
}

----------
10 [20 30]
10 [30 1 3 4]
60 48

返回值

多返回值

多返回值在声明函数时将返回值的类型括起来就可以。

func sum5()(int , string) {
    age := 18
    name := "张三" 
    return age,name
}

返回值命名

函数定义时可以给返回值命名,并在函数体中直接使用这些变量,最后通过return关键字返回。

func sum5()(age int , name string) {
    age = 18
    name = "张三" 
    return 
}

返回值补充

当我们的一个函数返回值类型为slice时,nil可以看做是一个有效的slice,没必要显示返回一个长度为0的切片。

func someFunc(x string) []int {
    if x == "" {
        return nil // 没必要返回[]int{}
    }
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:寒暄_HX

查看原文:3.2.9Golang的函数基础(函数,参数,返回值)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1148 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传