当前位置: 首页 > article >正文

golang - 函数的使用

核心化编程

为什么需要函数?

  1. 代码冗余问题
  2. 不利于代码维护
  3. 函数可以解决这个问题

函数

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

在 Go 中,函数分为:自定义函数(自己写的)、系统函数(系统提供的)

函数的定义

基本语法:

func 函数名(形参列表) (返回值列表) {
    执行语句...
    return 返回值列表
}

  • 形参列表:表示函数的输入
  • 函数中的语句:表示为了实现某一功能代码块
  • 函数可以有返回值,也可以没有

包的引入:

  • 在实际开发中,我们往往需要在不同的文件中,去调用其他文件的定义的函数,比如在 main.go 中,去使用 utils.go 文件中的函数,如何实现?——》包
  • 现在有两个程序员共同开发一个 Go 项目,程序员A 希望定义函数 cal,程序员B 也想定义函数 cal,两个程序员吵起来了,怎么办?——》包

包的原理图

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

 

 

 包的介绍

包的概念:

说明:go 的每一个文件都是属于一个包的,也就是说 go 是以包的形式来管理文件和项目目录结构的

包的三大作用:

  1. 区分相同名字的函数,变量等标识符
  2. 当程序文件很多时,可以很好的管理项目
  3. 控制函数、变量等访问范围,即作用域

包的相关说明:

  • 打包基本语法
    • package util
  • 引入包的基本语法
    • import "包的路径"

包的快速入门:

说明:包的快速入门——》Go 相互调用函数

使用包里面的函数

包名.函数名( )

包的注意事项和细节说明:

  1. 在给一个文件打包时,该包对应一个文件夹,比如这里的 utils 文件夹对应的包名就是 utils,文件的包名 通常 和文件所在的文件夹名一致,一般为小写字母
  2. 当引入一个文件要使用其它包函数或变量时,需先引入对应的包
    • 引入方式1:import "包名"
    • 引入方式2: import ( "包名")(和引入fmt 一样)
    • package 指令在文件第一行,然后是 import 指令
    • 在 import 包时,路径从 $GOPATH 的 src 下开始,不用带 src ,编译器会自动从 src 下开始引入
  3. 为了让其他包的文件,可以访问到本包的函数,则该函数名的首字母需要大写,类似其它语言的 public,这样才可以跨包访问。(比如 untils.go )
  4. 在访问其他包函数时,其语法是: 包名。函数名
  5. 如果包名较长,Go 语言支持给包取别名。注意细节:取别名后,原来的包名就不能使用了。说明:如果给包取了别名,则需要使用别名来访问该包的函数和变量
  6. 在同一个包下,不能有相同的函数名(也不能有相同的全局变量),否则报重复定义错误
  7. 如果你要编译成一个可执行程序文件,就需要将这个包声明为 main,即 package main。这个就是一个语法规范,包名可以自定义
    • 编译时需要编译 main 包所在的文件夹
    • 可以指定生产的可执行文件名 .exe,放在指定路径
      • go build -o bin\my.exe 后面时mian.go所在的路径
      • -o  代表输出
    • 当编译完会生成一个 pkg 文件,里面是库包 .a(里面是二进制)

函数的调用机制

 

 

 

 

 

 

  • 在调用一个函数时,会给该函数分配一个新的空间,编译器会通过自身的处理让这个新的空间和其他的栈的空间区分开来
  • 在每个函数对应的栈中,数据空间是独立的,不会混淆
  • 当一个函数调用完毕(执行完毕)后程序会销毁这个函数对应的栈空间。

return 语句

基本语法

Go 函数支持返回多个值,这一点是其他编程语言没有的

func 函数名(形参列表) (返回值列表) {
    语句...
    return 返回值列表
}
  1. 如果返回多个值时,在接收时,希望忽略某个返回值,则使用 _ 符号表示占位忽略
  2. 如果返回值只有一个,(返回值类型列表)可以不写 ()

 


http://www.kler.cn/news/18046.html

相关文章:

  • 什么是网络——TCP/IP协议
  • explain都不懂?搞什么数据库优化,快进来学习了
  • PAT A1032 Sharing
  • 《基于光学传感器的心房颤动检测:综述》阅读笔记
  • Docker笔记整理
  • 算法 DAY55 动态规划11 392.判断子序列 115.不同的子序列
  • MySQL基础(十一)数据处理之增删改
  • 拨云见日:深入理解 HTML 解析器与有限状态机
  • STC89C51系列单片机与ADC0832通信
  • PingCode 的环境和环境管理
  • 你知道ChatGPT里面的G、P、T分别代表什么吗?
  • 谷歌浏览器 | Chrome DevTools系统学习篇-概述
  • 用 Bitmap 实现亿级海量数据统计
  • 反调试与反反调试
  • 南卡OE系列再添新成员,造型犀利有型,性能强劲动听!
  • Java代码重构学习笔记-在对象之间搬移特性
  • Yolov8改进---注意力机制:ShuffleAttention、ECA、EffectiveSE、SE
  • Canal实战使用(集群部署)和原理解析
  • 代码随想录算法训练营day32 | 贪心算法:122.买卖股票的最佳时机II ,55. 跳跃游戏,45.跳跃游戏II
  • 计算机基础必读书籍
  • 从零开始学习Linux运维,成为IT领域翘楚(二)
  • vue3 - 超详细头像裁剪并上传到服务器,支持按照自定义比例裁切图片效果组件插件(详细示例源码教程,一键复制运行开箱即用)
  • 网络安全——传输层安全协议(3)
  • 深度学习入门篇1
  • Filter过滤器和Listener监听器
  • 【致敬未来的攻城狮计划】— 连续打卡第二十五天:RA2E1的 DTC传输模式
  • 深入浅出堆—C语言版【数据结构】
  • 为什么需要使用Docker
  • 掌握这些GitHub搜索技巧,你的开发效率将翻倍!
  • 使用MindSDK的at-server组件开发从机模组