Golang语言特点与技巧(二) | 青训营笔记

125 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记

上一篇的内容地址为:juejin.cn/post/710535…

四、函数
(1) 函数的基本写法与调用

首先,对于习惯了C++的学习者,在go中由于没有分号的特点,要注意以下的函数书写方式是错误的:

func g()
{
    ...
}

而正确的方式是:

func g(){
    ...
}

函数调用的方式为pack.Fun1(args1, args2, args3),其中pack即我们定义的package名,这里我们调用了pack下的函数Fun1,并且传入了参数args1 args2 args3

注意,在golang中不支持函数重载(函数重载即可以存在多个重名函数,它们拥有不同的参数)。golang放弃重载的原因是为了更高的执行效率。

此外,我们在函数的参数编写过程中,需要额外注意参数是按值传递还是按引用传递。Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量,比如 Function(arg1)。 如果我们希望函数可以直接修改参数的值,而不是对参数的副本进行操作,则需要将参数的地址(变量名前面添加 & 符号,比如 &variable)传递给函数,这就是按引用传递。

在golang中,我们也可以传入变长参数,例如一个求和的程序如下:

func myFunc(nums ...int)(res int) {
    for _, i := range nums{
        res += i
    }
    return 
}

我们调用时,这个函数就可以计算任意个数值的和了。

(2) 函数的返回值

在golang中,函数的返回值与C++等有着很大的不同,因为它允许了多个返回值的存在:

func g(a int)(int, int){
    return 2*a, a*a
}

如上,这样的特点很方便我们去编写一些函数。例如在本次字节训练营的抖音项目中,我们经常会碰到有函数是同时返回一个result与error的,这样方便我们输出错误与中断程序。

在golang中,推荐使用命名返回值的方式,这样我们的return后无需在接上其它数据,我们可以把上面的代码改造成如下:

func g(a int)(b int, c int){
    b = 2*a
    c = a*a
    return
}