Golang学习之路(五):Golang的函数

简介: Golang学习之路(五):Golang的函数

一、函数


1. 语法


func 函数名( [参数] ) [返回值类型] {
   函数体
}


2. 值传递


默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。

1)求a和b两个参数值之和:


package main
import "fmt"
func main() {
  result :=sum(1, 2)
  fmt.Println("a+b之和为:",result)
}
func sum(a, b int) int {
  return a+b
}


输出结果


a+b之和为: 3


2)Golang的函数返回值可以为多个:


package main
import "fmt"
func main() {
  res1,res2 :=fuc(1, 2)
  fmt.Println(res1,res2)
}
func fuc(a, b int) (int,int) {
  return a+b,a-b
}


输出结果


3 -1


3)也可以无返回值:


package main
import "fmt"
func main() {
  fuc(1, 2)
}
func fuc(a, b int) {
  fmt.Println("传入的值为:",a,b)
}


输出结果


传入的参数为: 1 2


3. 引用(指针)传递

引用传递是将参数的内存地址传递到函数中,如果在函数中对该参数值进行了修改,那外层的该参数值也会被修改。


举例说明


现在定义一个函数接受一个参数a,在打印a的值后将a赋值为3

下面是值传递的写法:


package main
import "fmt"
func main() {
  a :=1
  fuc(a)
  fmt.Println("值未被修改,还是为:",a)
}
func fuc(a int) {
  fmt.Println("传入的值为:",a)
  a=3
}


输出结果


传入的值为: 1
值未被修改,还是为: 1


下面是引用传递的写法:


package main
import "fmt"
func main() {
  a :=1
  fuc(&a)
  fmt.Println("值被修改了,由1变为了:",a)
}
func fuc(a *int) {
  fmt.Println("传入的值为:",*a)
  *a=3
}


输出结果


传入的值为: 1
值被修改了,由1变为了 3


二、函数用法


1. Golang中没有class


要知道的是,Golang中并没有Python、Java中的类(class)。Golang一切的一切都是函数,如果要实现一个class的话,可以这样写:


package main
import (
  "fmt"
  "strconv"
)
// Test 等于声明一个类
type Test struct {
  name string
  age int
}
func (tes *Test) print() string{
  return "我的名字是:"+tes.name+",我的年龄为:"+strconv.Itoa(tes.age)
}
func main() {
  obj := &Test{"曲鸟",18} //初始化并赋值
  b := obj.print()
  fmt.Println(b)
}


输出结果


我的名字是:曲鸟,我的年龄为:18


类中函数带参数的写法:


func (tes *Test) sum(a,b int) string{//求a+b的和
  return "a+b="+strconv.Itoa(a+b)
}
func main() {
  obj := &Test{"曲鸟",18} 
  b := obj.sum(3,3) 
  fmt.Println(b)
}


2. 闭包


闭包可以理解为“定义在一个函数内部的函数“,闭包是一座用于连接函数内部和函数外部的桥梁


对于上面的第一个例子(输出结果如下):


我的名字是:曲鸟,我的年龄为:18


使用闭包可以这样写:


package main
import (
  "fmt"
  "strconv"
)
func add(name string, age int) func() string {
  return func() string {  //相当于下面main中的obj
    return "我的名字是:" + name + ",我的年龄为:" + strconv.Itoa(age)
  }
}
func main() {
  obj := add("曲鸟", 18)
  fmt.Println(obj())
}


3. Golang中函数传递函数

Golang可以将函数作为变量的值


package main
import (
  "fmt"
)
func add9(a int) int  {//
  return a+9
}
func main(){
  a := func(x int) int {  //将该函数赋值给a
    return add9(6)
  }
  fmt.Println("a+9的值为:",a(9))
}


输出结果


a+9的值为: 15


目录
相关文章
|
Unix 程序员 编译器
第六章 Golang函数
第六章 Golang函数
82 0
|
SQL 前端开发 Go
编程笔记 GOLANG基础 001 为什么要学习Go语言
编程笔记 GOLANG基础 001 为什么要学习Go语言
114 1
golang中置new()函数和make()函数的区别
golang中置new()函数和make()函数的区别
|
Go
Golang语言之函数(func)进阶篇
这篇文章是关于Golang语言中函数高级用法的教程,涵盖了初始化函数、匿名函数、闭包函数、高阶函数、defer关键字以及系统函数的使用和案例。
345 3
Golang语言之函数(func)进阶篇
|
Go
Golang语言之函数(func)基础篇
这篇文章深入讲解了Golang语言中函数的定义和使用,包括函数的引入原因、使用细节、定义语法,并通过多个案例展示了如何定义不返回任何参数、返回一个或多个参数、返回值命名、可变参数的函数,同时探讨了函数默认值传递、指针传递、函数作为变量和参数、自定义数据类型以及返回值为切片类型的函数。
304 2
Golang语言之函数(func)基础篇
|
Unix Go
Golang语言标准库time之日期和时间相关函数
这篇文章是关于Go语言日期和时间处理的文章,介绍了如何使用Go标准库中的time包来处理日期和时间。
436 3
|
11月前
|
安全 Java Go
【Golang入门】简介与基本语法学习
Golang语言入门教程,介绍了Go语言的简介、基本语法、程序结构、变量和常量、控制结构、函数、并发编程、接口和类型、导入包、作用域以及错误处理等关键概念,为初学者提供了一个全面的学习起点。
349 0
|
编译器 Go C语言
通过例子学习在golang中调试程序
【7月更文挑战第4天】Go语言支持使用cgo进行汇编调试,官方文档在golang.org/doc/asm。注意,调试Go运行时可能遇到变量不可用或行号错误,需谨慎使用step命令。
177 1
通过例子学习在golang中调试程序
|
机器学习/深度学习 存储 人工智能
Golang bytes 包学习
Golang bytes 包学习
87 3
|
Go
Golang深入浅出之-Go语言函数基础:定义、调用与多返回值
【4月更文挑战第21天】Go语言函数是代码组织的基本单元,用于封装可重用逻辑。本文介绍了函数定义(包括基本形式、命名、参数列表和多返回值)、调用以及匿名函数与闭包。在函数定义时,注意参数命名和注释,避免参数顺序混淆。在调用时,要检查并处理多返回值中的错误。理解闭包原理,小心处理外部变量引用,以提升代码质量和可维护性。通过实践和示例,能更好地掌握Go语言函数。
335 1
Golang深入浅出之-Go语言函数基础:定义、调用与多返回值