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


目录
相关文章
|
19天前
|
Unix 程序员 编译器
第六章 Golang函数
第六章 Golang函数
31 0
|
19天前
|
编译器 Go
Golang底层原理剖析之函数调用栈-传参和返回值
Golang底层原理剖析之函数调用栈-传参和返回值
24 0
|
19天前
|
存储 编译器 Go
Golang底层原理剖析之函数调用栈-栈帧布局与函数跳转
Golang底层原理剖析之函数调用栈-栈帧布局与函数跳转
48 0
|
19天前
|
SQL 前端开发 Go
编程笔记 GOLANG基础 001 为什么要学习Go语言
编程笔记 GOLANG基础 001 为什么要学习Go语言
|
19天前
|
Go
golang中置new()函数和make()函数的区别
golang中置new()函数和make()函数的区别
|
19天前
|
Go
golang学习参考记录
golang学习参考记录
|
19天前
|
JSON Go 数据格式
golang学习7,glang的web的restful接口结构体传参
golang学习7,glang的web的restful接口结构体传参
|
19天前
|
JSON Go 数据格式
golang学习6,glang的web的restful接口传参
golang学习6,glang的web的restful接口传参
|
19天前
|
JSON Go 数据格式
golang学习5,glang的web的restful接口
golang学习5,glang的web的restful接口
|
19天前
|
Go
golang学习4,glang的web接口
golang学习4,glang的web接口