写点什么

【一 Go 到底】第十六天 --- 函数

作者:指剑
  • 2022-10-16
    重庆
  • 本文字数:2266 字

    阅读完需:约 1 分钟

【一Go到底】第十六天---函数

一、函数简介

1.1 何为函数

为完成某一功能的程序指令(语句)的集合,称为函数。在 Go 中,函数分为:自定义函数、系统函数(查看 Go 编程手册)

1.2 使用函数的优点

  1. 减少代码冗余

  2. 便于维护

1.3 基本语法

func 函数名 ( 形参列表 ) (返回值列表){    代码块    ......    return 返回值列表}
复制代码


  1. 形参列表: 表示函数的输入

  2. return 可以有也可以没有

二、函数案例

定义并使用一个计算功能的函数


package main
import "fmt"
func calc(num1 float64, num2 float64, operator byte) float64 { var res float64 switch operator { case '+': res = num1 + num2 case '-': res = num1 - num2 case '*': res = num1 * num2 case '/': res = num1 / num2 default: fmt.Println("操作符输入有误,请重新输入.....") } return res}
func main() { var num1 float64 = 100.86 var num2 float64 = 100.10 var operator byte = '+' result := calc(num1, num2, byte(operator)) fmt.Printf("计算结果为: %v", result)}
复制代码

三、包的引出和使用

3.1 包简介

包的本质实际上就是创建不同的文件夹,来存放程序文件

3.2 包的三大作用

  1. 区分相同名字的函数、变量等标识符

  2. 当程序文件很多时,可以很好的管理项目

  3. 控制函数、变量等访问范围,即作用域

3.3 打包基本语法

package 包名
复制代码

3.4 引入包的基本语法

import "包的路径"
复制代码

3.5 包的快速入门案例

3.5.1 案例演示文件结构

  • src/go

  • main

  • main.go

  • utils

  • utils.go

3.5.2 定义 utils.go 中的函数

package utils
import "fmt"
// 计算函数func calc(num1 float64, num2 float64, operator byte) float64 { var res float64 switch operator { case '+': res = num1 + num2 case '-': res = num1 + num2 case '*': res = num1 + num2 case '/': res = num1 + num2 default: fmt.Println("操作符输入错误,请重新输入........") } return res}
复制代码

3.5.3 在 main 函数中调用

package main
import ( "fmt" "go_code/chapter12/utils")
func main() {
var num1 float64 = 100.86 var num2 float64 = 100.10 var operator byte = '+' result := utils.Calc(num1, num2, operator) fmt.Printf("%v %c %v = %v", num1, operator, num2, result)}
复制代码

3.6 包的注意事项

  • 在给一个文件打包时,该包对应一个文件夹,比如这里的 utils 文件夹对应的包名就是 utils,文件的包名通常和文件所在的文件夹名一致,一般为小写字母。

  • 当一个文件要使用其它包函数或变量时,需要先引入对应的包

  • 引入方式 1: import "包名"

  • 引入方式 2:


  import (          "包名"          "包名"     )
复制代码


  • package 指令在文件第一行,然后是 import 指令。

  • 在 import 包时,路径从 $GOPATH 的 src 下开始, 不用带 src,编译器会自动从 src 下开始引入

  • 为了让其它包的文件,可以访问到本包的函数,则该函数名的首字母需要大写,类似其它语言的 public,这样才能跨包访问。比如 utils.go 的

  • 在访问其它包函数,变量时,其语法是包名.函数名,比如这里的 main.go 文件中

  • 如果包名较长,Go 支持给包取别名,注意细节:取别名后,原来的包名就不能使用了


import uts "go_code/chapter12/utils"
uts.Calc(num1, num2, operator)
复制代码


  • 在同一包下,不能有相同的函数名(也不能有相同的全局变量名),否则报重复定义

  • 如果你要编译成一个可执行程序文件,就需要将这个包声明为 main, 即 package main .这个就是一个语法规范,如果你是写一个库,包名可以自定义。


放在bin目录// 运行命令先进入gopath的位置,然后执行命令go build -o bin/calc.exe go_code/xxx/main
复制代码

四、函数的调用机制

4.1 案例演示一


package main
import "fmt"
// 此处形参 num1 func add(num1 int) { num1 += 1 fmt.Println("num1 = ", num1)}
func main() {
num1 := 10
// 调用add // 传入实参 num1:=10 add(num1) // 打印的是num1,没有经过add()函数加工 fmt.Println("num1 = ", num1)}
复制代码


  • (1)在调用- -个函数时,会给该函数分配一-个新的空间,编译器会通过自身的处理让这个新的空间和其它的栈的空间区分开来

  • (2)在每个函数对应的栈中,数据空间是空间的,不会混淆

  • (3)当一个函数调用完毕(执行完毕)后,程序会销毁这个函数对应的栈空间。

4.2 案例演示二(函数返回)


package main
import "fmt"
func sumNums(num1 int, num2 int) int { sum := num1 + num2 fmt.Println("总和为: ", sum) return sum}func main() {
num1 := 10 num2 := 20
// 调用sumNums // 将实参 num1:=10,num2:=20 传入 // 调用sumNums函数会打印出总和,并且返回 sum的值 // 使用变量sum 接收 sumNums中的返回值 // 注意此处的sum 和 sumNums的 sum 并不是同一个 sum := sumNums(num1, num2)
fmt.Println("sum = ", sum)}
复制代码

五、 return 语句

5.1 return 基本语法

func 函数名(形参列表) (返回值类型列表){    代码块    return 返回值列表}
复制代码


  • 如果返回多个值时,在接收时,希望忽略某个返回值,则使用_符号 表示占位忽略

  • 如果返回值只有一个(返回值类型列表) 可以不写()

5.2 案例演示(多返回值)

package main
import "fmt"
func sumAndsub(num1 int, num2 int) (int, int) { sum := num1 + num2 sub := num1 - num2 return sum, sub}func main() {
num1 := 10 num2 := 20
// 调用sumAndsub sum, _ := sumAndsub(num1, num2) _, sub := sumAndsub(num1, num2)
fmt.Println("sum = ", sum) fmt.Println("sub = ", sub)
}
复制代码


发布于: 刚刚阅读数: 4
用户头像

指剑

关注

InfoQ签约作者 2022-07-13 加入

AWS Community Builder,AWS Student Ambassador,阿里云专家博主,OPS社区创始成员

评论

发布
暂无评论
【一Go到底】第十六天---函数_Go_指剑_InfoQ写作社区