go语言--函数

news2024/9/22 5:44:28
package main
  
import "fmt"

func main(){
	//功能: 10 + 20
	var num1 int = 10
	var num2 int = 20

	var sum int = 0
	sum += num1
	sum += num2

	fmt.Println(sum)
}

为什么使用函数

提高代码的复用性,减少代码冗余, 代码维护性也提高了

函数的定义

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

基本语法

func 函数名(形参列表)(返回值类型列表){
    执行语句..
    return + 返回值列表
}
package main
  
import "fmt"

func addSum(num1 int,num2 int) (int){ //如果返回值类型就一个的话,那么()可以省略
	return num1 + num2
}

func main(){
	//功能: 10 + 20
	var sum int = addSum(10,50)
	fmt.Println(sum)
}

函数的一些注意点

go语言中函数是并列的,所以你无论写在main函数的前面还是后面都是可以调用到函数

命名规则

函数名
  • 首字母不能是数字
  • 首字母大写该函数可以被本报文件和其他文件使用(类似于public)
  • 首字母小写只能被本包文件使用,其他文件不能使用(类似于private)
形参列表
  • 形参列表: 个数: 可以是一个参数,可以是n个参数, 可以是0个参数
  • 参数列表: 作用: 接收外来的数据
  • 实际参数: 实际传入的数据:
返回值类型列表
  • 可以返回0个数据
  • 可以返回1个数据
  • 可以返回多个数据
返回0个数据
package main
  
import "fmt"

func addSum(num1 int,num2 int){
	fmt.Println(num1 + num2)
}
func main(){
	addSum(10,50)
}
返回1个数据
func addSum(num1 int,num2 int) int{ //如果返回值只有一个,那么返回值的左右()可以省略不写
	return num1 + num2
}
返回多个(俩个)数据
package main
  
import "fmt"

func calSum(num1 int,num2 int) (int ,int) {
	var sum1 int = num1 + num2
	var sum2 int = num1 - num2
	return sum1,sum2
}

func main(){
	//功能: 10 + 20
	// var sum int = addSum(10,50)
	// fmt.Println(sum)
	sum,jian := calSum(50,10)
	fmt.Println(sum,jian)
}

返回多个(俩个)数据

如果你想要忽略其中一个返回值
package main
  
import "fmt"

func calSum(num1 int,num2 int) (int ,int) {
	var sum1 int = num1 + num2
	var sum2 int = num1 - num2
	return sum1,sum2
}

func main(){
	sum,_ := calSum(50,10) //_:忽略
	fmt.Println(sum)
}

在这里插入图片描述

如果只有一个参数接俩个返回(错误)
package main
  
import "fmt"

func calSum(num1 int,num2 int) (int ,int) {
	var sum1 int = num1 + num2
	var sum2 int = num1 - num2
	return sum1,sum2
}

func main(){
	sum := calSum(50,10) //一个参数接俩个返回
	fmt.Println(sum)
}

在这里插入图片描述

内存注意点

package main
  
import "fmt"

func main(){
	var num1 int = 10
	var num2 int = 20
	fmt.Printf("交换前num1:%d,num2:%d\n",num1,num2)
	jiaohuan(num1,num2)
	fmt.Printf("交换后num1:%d,num2:%d\n",num1,num2)
}

//交换俩个数
func jiaohuan (num1 int,num2 int){
	var t int
	t = num1
	num1 = num2
	num2 = t
}

在这里插入图片描述

实际上jiaohuan(函数)执行结束后,内存会销毁jiaohuan栈帧(栈空间),实际上将形参进行了交换,跟在外界的俩个数没有任何关系

内存分析

    • 存放基本数据类型
    • 存放引用/复杂数据类型
  • 代码区
    • 存放代码本身

若你执意要改变它们本身

package main
  
import "fmt"

func main(){
	var num1 int = 10
	var num2 int = 20
	fmt.Printf("交换前num1:%d,num2:%d\n",num1,num2)
	num1,num2 = jiaohuan(num1,num2) //将返回结果赋值给num1和num2
	fmt.Printf("交换后num1:%d,num2:%d\n",num1,num2)
}

//交换俩个数
func jiaohuan (num1 int,num2 int) (int,int){  //添加返回值
	var t int
	t = num1
	num1 = num2
	num2 = t
	return num1,num2
}

在这里插入图片描述

Go语言不支持重载

函数名相同,形参列表不同

package main
  
import "fmt"

func main(){
	var num1 int = 10
	var num2 int = 20
	fmt.Printf("交换前num1:%d,num2:%d\n",num1,num2)
	num1,num2 = jiaohuan(num1,num2)
	fmt.Printf("交换后num1:%d,num2:%d\n",num1,num2)
}

//交换俩个数
func jiaohuan (num1 int,num2 int) (int,int){
	var t int
	t = num1
	num1 = num2
	num2 = t
	return num1,num2
}
func jiaohuan (num1 int) (int,int){
	var num2 int = num1
	return num1,num2
}

Go语言不支持重载

declared: 定义,声明
re: 在编程语言中是重复反复的意思

Golang中支持可变参数(如果你希望函数带有可变参数)

package main

//定义一个函数,函数的参数为: 可变参数 ... 参数的数量可变
//args...int: 可以传入任意多个数量的int类型的数据 传入0~n个实参
func test(args...int){}

func main(){
	test()
	test(1,2,3,4,5)
}

基本数据类型和数组默认都是值传递的,即进行拷贝。不会影响到原来的值

package main
  
import "fmt"

func test(num int){
	num = 30
	fmt.Println("test--",num)
}

func main(){
	var num int = 10
	test(num)
	fmt.Println("main--",num)
}

在这里插入图片描述

在内存中, test栈帧中的值只是将test里的num值进行了改变,而main中的num并没有改变(改的是形参)

以值传递的方式的数据类型,如果希望在函数的变量能修改函数外的变量,可以传递变量的地址&,函数内以指针的方式操作变量,从效果来看类似引用传递

package main
  
import "fmt"

//参数的类型是指针
func test(num *int){
	*num = 30
	fmt.Println("test--",*num)
}

func main(){
	var num int = 10
	test(&num)
	fmt.Println("main--",num)
}

在这里插入图片描述

在Go中函数也是一种数据类型,可以传递给一个变量,则该变量就是一个函数类型的变量,通过该变量可以对函数调用

package main
  
import "fmt"

//参数的类型是指针
func test(num int){
	fmt.Println(num)
}

func main(){
	
	a := test
	fmt.Printf("a对应的类型:%T,test函数对象的类型: %T",a,test)//a对应的类型:func(int),test函数对象的类型: func(int)
}


在这里插入图片描述

对函数进行调用

package main
  
import "fmt"

//参数的类型是指针
func test(num int){
	fmt.Println(num)
}

func main(){
	
	a := test
	fmt.Printf("a对应的类型:%T,test函数对象的类型: %T\n",a,test)//a对应的类型:func(int),test函数对象的类型: func(int)
	a(10)//等价于test(10)
}


在这里插入图片描述

函数既然是一种数据类型,因此在Go中,函数可以作为形参,并且调用(把函数本身当作一种数据类型)

package main
  
import "fmt"

//参数的类型是指针
func test(num int){
	fmt.Println(num)
}

func test02(num1 int,testFunc func(int)){
	fmt.Println("test--",testFunc)
}

func main(){
	
	a := test
	fmt.Printf("%T,%T\n",a,test)
	test02(10,a)
}

把函数本身当作一种数据类型

为简化数据类型定义,Go支持自定义数据类型

基本语法: type 自定义数据类型名 数据类型

package main
  
import "fmt"

func main(){
	
	type myInt int

	var i myInt = 10
	fmt.Printf("%T\n",i)
}

在这里插入图片描述

package main
  
import "fmt"

func main(){
	
	type myInt int

	var i myInt = 10
	fmt.Printf("%T\n",i)
	var a int = 20
	a = i //虽然是别名,但是在go中编译识别的时候还是认为myInt和int是一个数据类型
}

在这里插入图片描述

要让运行通过将myInt转成int(强转)

package main
  
import "fmt"

func main(){
	
	type myInt int

	var i myInt = 10
	fmt.Printf("%T\n",i)
	var a int = 20
	a = int(i)//虽然是别名,但是在go中编译识别的时候还是认为myInt和int是一个数据类型
}

支持函数起别名

type mySun func(int,int)int–>这是mySum就等价一个哈桑农户类型func(int,int) int

package main
  
import "fmt"

func test(num int){}
type myFunc func(int)
func test02(num int,test myFunc){
	fmt.Println("test--",test)
}

func main(){
	a := test
	test02(10,a)
}

在这里插入图片描述

支持对函数返回值命名

package main
  
import "fmt"

func test(num1 int,num2 int)(sum int, sub int){
	sum = num1 + num2
	sub = num1 - num2
	return
}

func main(){
	sum,sub := test(10,5)
	fmt.Println(sum,sub)
}

在这里插入图片描述
可以说是

func test(num1 int,num2 int)(int,int){
	sum := num1 + num2
	sub := num1 - num2
	return sum,sub
}

的升级版了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IRCNN-FPOCS 文章解读

1、论文概述 1)待解决的问题:地震道数据缺失(野外地震数据的质量往往受到地质环境或设备参数的影响,这些数据可能在空间上不连续,导致地震痕迹缺失,也称为下采样观测) 2)目的&…

从菜鸟到团队协同大神:产品经理工具技能修炼

现在,自雇人士和自由职业者越来越普遍。受环境影响,员工们正在放弃朝九晚五的工作,转而采用更灵活的远程工作,另一方面,随着办公数字化转型、远程办公的需求强烈、在线协协同管理工具飞项等一批知名互联网工具如雨后春…

c#入门-捕获变量

局部变量捕获 局部函数,匿名函数,可以直接在函数体内使用局部变量。 如果作为委托使用,传递给别人。可能在别人使用委托的时候,这些局部变量的作用域就已经消失了。 因此,编译器会对这些变量做出特殊的操作&#xff…

优维低代码:I18n 国际化

优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。 连载…

第8季3:使用字库字符实现区域显示

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 一、代码框架分析 在第8季2:OSD实验演示与代码分析中,我们分析了SAMPLE_RGN_CreateVideoRegion函数,该函数完成了左下角的logo区域显示、右下角的时间区域显示&a…

Ubuntu18.04安装教程

Ubuntu18.04安装教程# 阿里云源 deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates ma…

【Vue+Springboot】综合程序设计后端部分实现(含跨越访问)

文章目录1、功能展示2、前端部分:VueAPI3、后端部分:Springboot1、功能展示 大致分为用户管理,商品管理,收藏管理,购物车管理,订单管理五个模块。 2、前端部分:VueAPI Vue 使用 axios 库进行网…

如何在Unity中实现MVC模式?

MVC是什么? ​ MVC即Model View Controller,是模型(model)【数据层】-视图(view)【表现层】-控制器(controller)【逻辑层】的缩写。主要应用于网站开发,在游戏开发方面,因为不同游戏的需求、功能不尽相同&…

数字化转型迫在眉睫,企业应该如何面对?

火热的数字化转型,在国企、央企公布数字化转型规划后,进一步向各行各业开始扩散,吸引了很多对于数字化并不熟悉的企业。这些企业大多没有一个确定的目标,只是想要让企业完成转型改革,所以对于怎样做没有什么好的规划。…

Unity3d C#实现基于SocketIOUnity的与后端(node.js为例)Socket通信功能(含工程)

#前言 该功能主要是项目上的需求,按后端的需求就是我们通过SocketIO进行通信,之前游戏通信功能大多是基于原始的Socket进行封装,需要对包体进行设计,还需要粘包拆包等系列操作,属实有点麻烦。这次尝试了SocketIOUnity的…

Exynos_4412——RTC实验

目录 一、ADC小作业 二、RTC简介 三、Exynos_4412下的RTC控制器 四、RTC中的寄存器 五、RTC编程 六、RTC小作业 一、ADC小作业 电压在1501mv~1800mv时,LED2、LED3、LED4、LED5点亮 电压在1001mv~1500mv时,LED2、LED3、LED4点亮 电压在501mv~1000m…

什么是芯片老化测试?芯片老化测试系统NSAT-2000解决方案

随着半导体电子技术的进步,老化测试已成为保证产品质量的关键流程。除了半导体元件外,PCB、IC 和处理器部件也都需要在老化条件下进行测试。本篇文章纳米软件Namisoft小编将带大家分享一下关于芯片老化测试系统的相关知识。 一、什么是芯片老化测试&…

开发工具篇第十二讲:常用开发库 - Lombok工具库详解

开发工具篇第十二讲:常用开发库 - Lombok工具库详解 Lombok是一款非常实用Java工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO)。实际上我并不推荐使用Lombok(不主动使用它&…

CANoe测试TC8

OPEN联盟发布的TC8是目前行业内关于车载以太网的标准测试规范之一。 CANoe环境需要硬件和软件: 硬件是CANoe设备,用来连接电脑和DUT,TC8测试的是以太,那么CANoe设备必须支持以太才行,目前VN5640以上都是支持的。 软件需要安装CANo…

对git rebase 和git merge的理解

一、是什么 在使用 git 进行版本管理的项目中,当完成一个特性的开发并将其合并到 master 分支时,会有两种方式: git mergegit rebase git rebase 与 git merge都有相同的作用,都是将一个分支的提交合并到另一分支上,…

物联网技术在地下综合管廊智能化建设中的应用实例分析

摘 要:物联网是21世纪传感技术、通信技术、信息技术的应用大集成利用物联网技术实现地下综合管廊的智能化管理符合经济和城市规划发展的需要分析了物联网技术的特点及地下综合管廊建设中物联网技术的应用并结合物联网技术在地下综合管廊建设的应用实例对物联网技术在地下综合…

Qt扫盲-Windows任务栏使用总结

Qt扫盲-Windows任务栏使用总结一、概述二、覆盖图标和进度指示器三、跳转列表四、缩略图工具栏一、概述 任务栏为用户提供了访问桌面上打开的应用程序的权限。Windows自动在任务栏上创建用于访问应用程序窗口的按钮。 从 Windows 7到Windows10 都有效果。就是在任务栏上的一个…

基于springboot框架个人博客管理系统

一、项目简介 本项目是一套基于springboot框架实现的个人博客管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试&a…

头歌:UDP Ping程序实现 客户端创建UDP套接字

头歌平台:头歌实践教学平台 (educoder.net)创建数据包套接字套接字 Socket 实质上提供了主机间进程通信的连接点。进程通信之前,双方首先必须各自创建一个连接点,否则是没有办法建立联系并相互通信的。一个完整的 Socket {协议,本地地址,本地端口,远程地…

在 React 中使用 i18next

1. 安装依赖 npm i i18next react-i18next i18next-browser-languagedetectori18next 提供了翻译的基本能力。react-i18next 是 i18next 的一个插件,用来降低 react 的使用成本。i18next-browser-languagedetector 是用来检测浏览器语言的插件。 2. 在src下创建i18…