Golang 基础之函数使用 (一)
大家好,今天将梳理出的 Go语言函数用法内容,分享给大家。 请多多指教,谢谢。
本次《Go语言函数使用》内容共分为三个章节,本文为第一章节。
- Golang 基础之函数使用 (一)
- Golang 基础之函数使用 (二)
- Golang 基础之函数使用 (三)
- 函数介绍
- 函数特点
- 函数声明
- 传参方式
- 不定参数传值
- 任意参数类型的不定参数
- 返回值
为了完成某一功能的程序指令(语句)的集合,称为函数。
【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 inttemp = *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类型,我们可以通过使用slice对象做变参时,必须展开。arg[index]
依次访问所有参数,通过len(arg)
来判断传递参数的个数。
package mainimport (
"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
}
技术文章持续更新,请大家多多关注呀~~
搜索微信公众号【 帽儿山的枪手 】,关注我
推荐阅读
- 学习Linux须知1.2之Linux命令的实战
- Linux(内核剖析):09---进程调度之Linux调度的实现(struct sched_entityschedule())
- Linux(内核剖析):08---进程调度之Linux调度算法(调度器类公平调度(CFS))
- 服务/软件管理(19---Linux与Windows之间Zmodem协议的开启与使用(rzsz命令))
- Linux(内核剖析):06---进程之线程的实现
- 服务/软件管理(17---Linux与Windows之间Samba服务的开启与使用)
- Linux(内核剖析):04---进程之struct task_struct进程描述符任务结构介绍
- Linux(内核剖析):28---内核同步之(临界区竞争条件同步锁常见的内核并发SMNP和UP配置选项锁的争用和扩展性(锁粒度))
- Linux(程序设计):64---高性能定时器之时间堆
- Linux(内核剖析):26---中断下半部之(工作队列机制(workqueue_structcpu_workqueue_struct))