Golang基础之函数使用(参数传值)实例详解

 更新时间:2023年10月19日 10:40:20   作者:帽儿山的枪手  
这篇文章主要为大家介绍了Golang基础之函数使用(参数传值)实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

函数介绍

为了完成某一功能的程序指令(语句)的集合,称为函数。

Go 语言的函数可以分为:自定义函数和系统函数。Go 语言函数与其他语言函数最大的不同是,Go 语言的函数可以支持返回任意多个值,而其他语言的函数一般只支持返回一个值。

比如C语言函数返回值只能是一种类型。

Go 语言的函数也支持普通函数、匿名函数和闭包三种形式。

函数特点

  • 无需声明原型
  • 支持不定变参
  • 支持多返回值
  • 支持命名返回参数
  • 支持匿名函数和闭包 (变向的高阶函数)
  • 函数也是一种类型,一个函数可以赋值给变量
  • 不支持嵌套 (nested) 一个包不能有两个名字一样的函数
  • 不支持重载 (overload)
  • 不支持默认参数 (default parameter)

函数声明

函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。

func name(parameter-list) (result-list) {   // 声明函数名
  // 函数体
}

如果函数返回一个无名变量或者没有返回值,返回值列表的括号是可以省略的。如果一个函数声明不包括返回值列表,那么函数体执行完毕后,不会返回任何值。

传参方式

值传递

指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

func num(x, y int) int {
       // 处理逻辑
}

引用传递

是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

func swap(x, y *int) {
    var temp int

    temp = *x /* 保存 x 的值 */
    *x = *y   /* 将 y 值赋给 x */
    *y = temp /* 将 temp 值赋给 y*/
}

无论是值传递,还是引用传递,传递给函数的都是变量的副本,不过,值传递是值的拷贝。

引用传递是地址的拷贝,一般来说,地址拷贝更为高效。而值拷贝取决于拷贝的对象大小,对象越大,则性能越低。

map、slice、chan、指针、interface默认以引用的方式传递。

不定参数传值

函数的参数不是固定,后面的类型是固定的。 (可变参数)

golang可变参数本质上就是slice。

在参数赋值时可以不用一一的赋值,可以直接传递一个数组或者切片,注意在参数后加上  即可。

func myfunc(args ...int) {    //0个或多个参数
}
func add(a int, args ...int) int {    //1个或多个参数
}
func add(a int, b int, args ...int) int {    //2个或多个参数
}

其中args是一个slice类型,我们可以通过 arg[index] 依次访问所有参数,通过 len(arg) 来判断传递参数的个数。

使用slice对象做变参时,必须展开。

package main
import (
    "fmt"
)
func sum(s string, n ...int) string {
    var x int
    for _, i := range n {
        x += i
    }
    return fmt.Sprintf(s, x) // 字符串拼接
}
func main() {
    s := []int{1, 2, 3}
    res := sum("sum: %d", s...)    // slice... 展开slice
    println(res)
}

输出结果

sum: 6

任意类型的不定参数

函数的参数和每个参数的类型都不是固定的。

用 interface{} 传递任意类型数据是Go语言的惯例用法,而且 interface{} 的类型是安全的。

func myfunc(args ...interface{}){ // 示例用法
  ...
}

返回值

_ 标识符,用来忽略函数的某个返回值。

Go 的返回值可以被命名, 返回值的名称应当具有一定意义。

没有参数的 return 语句返回各个返回变量的当前值,这种用法被称作“裸”返回。

func myfunc(arg int) (arg int) { // 示例用法
   return arg
}

以上就是Golang基础之函数使用(参数传值)实例详解的详细内容,更多关于Golang函数参数传值的资料请关注脚本之家其它相关文章!

相关文章

  • go语言题解LeetCode228汇总区间示例详解

    go语言题解LeetCode228汇总区间示例详解

    这篇文章主要为大家介绍了go语言题解LeetCode228汇总区间示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • goland服务热重启的配置文件

    goland服务热重启的配置文件

    这篇文章主要介绍了goland服务热重启的配置文件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Golang解析yaml文件操作指南

    Golang解析yaml文件操作指南

    之前一直从事java开发,习惯了使用yaml文件的格式,尤其是清晰的层次结构、注释,下面这篇文章主要给大家介绍了关于Golang解析yaml文件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • 如何在Go中使用切片容量和长度

    如何在Go中使用切片容量和长度

    这篇文章主要介绍了如何在Go中使用切片容量和长度,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • go REST API设计模式和反模式示例解析

    go REST API设计模式和反模式示例解析

    在这篇文章中,我们将探讨一些常见的REST API设计模式和开发者应该注意的反模式,我们还将提供Golang和Open API Schema的代码片段来帮助说明这些概念,有需要的朋友可以借鉴参考下
    2023-09-09
  • Go语言中goroutine的使用

    Go语言中goroutine的使用

    本文主要介绍了Go语言中goroutine的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 一文初探 Goroutine 与 channel基本用法

    一文初探 Goroutine 与 channel基本用法

    这篇文章主要为大家介绍了一文初探 Goroutine 与 channel基本用法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • golang小游戏开发实战之飞翔的小鸟

    golang小游戏开发实战之飞翔的小鸟

    这篇文章主要给大家介绍了关于golang小游戏开发实战之飞翔的小鸟的相关资料,,本文可以带你你从零开始,一步一步的开发出这款小游戏,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • Go语言常见哈希函数的使用

    Go语言常见哈希函数的使用

    哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。具体的介绍网上有很详细的描述,如闲聊哈希表 ,这里就不再累述了;
    2015-03-03
  • golang 并发编程之生产者消费者详解

    golang 并发编程之生产者消费者详解

    这篇文章主要介绍了golang 并发编程之生产者消费者详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05

最新评论