【Go语言快速上手(二)】 分支与循环函数讲解

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:Go语言专栏⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习更多Go语言知识
  🔝🔝


在这里插入图片描述

Go快速上手

  • 1. 前言
  • 2. 分支与循环
    • 2.1 for循环和for range
    • 2.2 switch语句
  • 3. 函数的引入
  • 4. 包的引入
  • 5. init函数讲解
  • 6. 匿名函数讲解
  • 7. defer关键字讲解
  • 8. 字符串函数讲解
  • 9. 内置函数
  • 10. 总结以及拓展

1. 前言

经过第一篇文章的学习,现在我们对GO已经有了一个初步的了解,接下来会站在使用它的角度,给大家讲解一些语法和GO语言的组件

本章重点:

本篇文章着重讲解GO语言的分支与循环语句,以及GO语言中的函数的特性,以及函数是怎样定义的?最后会讲解几个特殊的函数,包括init函数,匿名函数,以及defer关键字的用途,字符串函数和日期函数


2. 分支与循环

GO语言中的分支循环和C很类似,也是用if,else if,else以及for循环,switch语句来完成任务.比较特别的是,GO语言中没有while循环,但是新增了一个叫for range的东西,后面会一一讲解

if,else语句

var age int = 18
if age>=18{
	fmt.Println("可以去网吧")
}else{
	fmt.Println("不能去网吧")
}

GO语言比较特别的是,if语句的判断条件不用加括号,判断条件可直接写.除此之外,GO语言的if,else语句可不是能随意写的,下面这种写法就是错误的

var age int = 18
if age>=18{
	fmt.Println("可以去网吧")
}
else{
	fmt.Println("不能去网吧")
}

2.1 for循环和for range

在这里插入图片描述
代码实例:

var str string = "abcdefg"
for i := 0;i<len(str);i++{
	fmt.Println(str[i])
}

go语言的for循环中的初始表达式位置,不能使用var来定义变量,只能用:=的形式,并且,for循环的括号也是可以省略的,甚至连初始表达式和迭代因子都可以省略.注:len是内置函数,可以求字符串/数组的长度

for range

for range是GO语言独有的一种迭代结构,它可以遍历字符串,数组,切片,map等诸多类型,它的语法有一点像C++11中的范围for,它的一般形式为: for key,value := range coll{}

代码实例

var str string = "abcdefg"
for key,value := range str{
	fmt,Printf("下标为: %d,值为: %c",key,value)

for range中的key代表数组/字符串的下标,也可以叫索引,而value代表数组/字符串中的元素. 如果你不想接收下标,可以这样写: for _,value := range str{}.


2.2 switch语句

在这里插入图片描述
代码实例

var grade int = 81
switch grade/10{
	case 10:
	fmt.Println("优秀")
	case 9:
	fmt.Println("优秀")
	case 8:
	fmt.Println("良好")
	case 7:
	fmt.Println("良好")
	case 6:
	fmt.Println("及格")
	default:
	fmt.Println("不及格")
}

GO语言中的switch语句中的每一个case都自带break,这和C语言有大不同,GO语言的switch语句还有以下特征,大家可以下来自行验证

在这里插入图片描述


3. 函数的引入

在这里插入图片描述

代码实例:

func add(x int,y int) int{
	return x+y
}
func main(){
	var age int = add(10,20)
	fmt.Println(age)
}

GO语言中函数的传参默认也是传递,和C一样,并且GO语言不支持函数重载,除此之外,GO语言的函数命名也有讲究,细节如下:

在这里插入图片描述

在GO语言中,函数也是一种数据类型,它可以赋值给一个变量,也可以当作其他函数的形参被传入函数中,这一点类似于C++11当中的function,并且,GO语言的函数还可以重命名返回值,注:GO语言的函数可能有多个返回值,有多个返回值时需要把返回值带上括号

代码实例一:

func sub(x int,y int) int{
	return x-y
}
func main(){
	function := sub
	var tmp int = function(20,10)
	fmt.Println(tmp)
}

代码实例二:

//写法一
func mytask(x int,y int) (int,int){
	return x+y,x-y
}
//写法二
func mytask(x int,y int) (sum int,sub int){//重命名返回值
	sum := x+y
	sub := x-y
	return //不用写特定的变量或值,系统会自动返回sum和sub两个变量
}

4. 包的引入

前面一直有在说包,那到底什么是包?包实际上就是一个文件夹,这个文件夹中存放了你的.go文件,那么为什么要有包?在C++中我们常说到,实现一个项目时,不可能只在一个源文件中进行,我们可能会定义多个源文件,而在GO语言中我们常常称使用多个包完成不同的任务,并且引入包可以解决同名函数等问题

注意事项: GO语言的第一行代码往往是package main,这是在main函数中需要写出package main,但是假如当前文件没有main函数,它只是一组方法的集合,那么这个时候就不能写成package main了,假设这个.go文件所在的文件夹叫tmp,那么就应该写成: package tmp,以此类推

只要在同一个文件下,所有的.go文件都属于一个包,所以在同一个文件下,不同的源文件也不能定义同名函数,因为一个包只能有唯一命名的函数


5. init函数讲解

init函数,又称初始化函数,可以用来进行一些初始化工作,每一个源文件中都可以包含一个init函数,该函数会在main函数执行前就被GO运行框架调用

两个问题:

  1. 全局变量,init函数,main函数的执行顺序
  2. 多个源文件都有init函数时的执行顺序
var age int = var(10,20)
func var(x int,y int) int{
	fmt,Println("全局变量被执行")
	return x+y
}
func init(){
	fmt,Println("init函数被执行")
}
func main(){
	fmt,Println("main函数被执行")
}

结论:

  • 全局变量>init>main函数
  • 其他包的init函数>main包的init函数

6. 匿名函数讲解

在这里插入图片描述

代码实例:

func main(){
	var ret int = func(x int,y int) int{
		return x+y
	}(10,20)//最后进行传参
	fmt.Println(ret)
}

7. defer关键字讲解

在函数中,程序员经常需要创建资源(比如堆区资源,文件描述符等),为了在函数执行完毕后,能够很好的释放这些资源,GO语言提供了defer关键字

func add(x int,y int) int{
	defer fmt.Printf("x的值为: %d",x)
	defer fmt.Printf("y的值为: %d",y)

	x += 100
	y +=50
	var sum int = x+y
	fmt.Println(sum)
	return sum
}

func main(){
	var tmp int = add(10,20)
	fmt.Println(tmp)
}

GO中,语句defer关键字修饰的语句时,不会立刻执行此语句,而是将此语句压入到一个栈中,等整个函数调用结束时再执行栈中的语句,并且,压入栈中的语句的值已经定了,即使在后面修改了值(比如上面代码中的x和y),栈中也不会受影响

使用场景: 打开文件描述符时,立马用defer写一个关闭文件描述符的语句,就不会遗忘释放资源


8. 字符串函数讲解

字符串函数有很多,大家不必全部背下来,有个影响就行,到时候真正要用的时候再查文档即可

在这里插入图片描述

有些字符串函数有两个返回值,第二个往往是err,代表执行这个函数时是否出错,如果你不想接收它,直接用下划线_省略掉即可.注意,字符串函数需要import包:strconv,而strings是内置的包,可以直接使用

var str string = "abcdefg"
r := []rune(str)//将str转换为切片后再使用
for i:=0;i<len(r);i++{
	fmt.Println(r[i])
}
pos := strings.lndex("i love cpp,i love golang",'c')

在这里插入图片描述

字符串函数很多,就不一一举例子了,大家可以下来试着编写一下demo


9. 内置函数

golang设计者为了编程方便,提供了一些不用导包就可以直接使用的函数,称为内置函数,下面是常见的内置函数:

  • len函数: 统计字符串/数组/切片等的长度
  • new函数: 分配内存,主要用来分配值类型,如:int,float,string,数组,结构体
  • make函数: 分配内存,主要用于分配引用类型,如:指针,切片,map等
  • new和make函数都是在堆区开辟空间

10. 总结以及拓展

GO语言还是挺好上手了,基本上写一遍就能知道它的用法,如果你基础语言学的比较扎实,你甚至可以想象出它底层是如何设计的,本系列文章的重点将放在GO语言的快速上手,所以就没有讲底层的原理,如果是校招要想找GO语言相关工作的同学,我还是建议你们多多深造一下

拓展:GO语言的API接口

Go语言标准文档(中文版)


🔎 下期预告:错误处理,数组以及切片 🔍

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中国隧道空间分布

中国隧道空间分布数据&#xff0c;包含2020年全国大部分地区16000余条隧道分布点位数据&#xff0c;数据包括市名称、区县名称、隧道名称和隧道经纬度。数据包含shp和EXCEl两种格式&#xff0c;部分隧道空间位置有偏移。 欢迎大家关注、收藏和留言&#xff0c;如果您想要什么数…

【GPT-4最新研究】GPT-4与科学探索:揭秘语言模型在科学领域的无限可能

各位朋友们&#xff0c;你们知道吗&#xff1f;自然语言处理领域最近取得了巨大的突破&#xff01;大型语言模型&#xff08;LLM&#xff09;的出现&#xff0c;简直就像打开了新世界的大门。它们不仅在语言理解、生成和翻译方面表现出色&#xff0c;还能涉足许多其他领域&…

网站创建的流程是什么

网站的创建过程包括几个主要的步骤&#xff0c;其中涉及到一系列的决策和实践操作。下面我将详细介绍网站创建的流程&#xff0c;帮助读者了解如何创建一个成功的网站。 第一步&#xff1a;确定网站目标和功能 在创建网站之前&#xff0c;你需要明确自己网站的目标和功能。是用…

【Proteus】51单片机对直流电机的控制

直流电机&#xff1a;输出或输入为直流电能的旋转电机。能实现直流电能和机械能互相转换的电机。把它作电动机运行时是直流电动机&#xff0c;电能转换为机械能&#xff1b;作发电机运行时是直流发电机&#xff0c;机 械能转换为电能。 直流电机的控制&#xff1a; 1、方向控制…

详细介绍医用PSA变压吸附制氧机设备的工艺特点

随着技术的不断进步&#xff0c;医用氧气作为一种重要的治疗资源&#xff0c;其供应方式也在不断地改进和升级。其中&#xff0c;医用PSA(Pressure Swing Adsorption&#xff0c;变压吸附)变压吸附制氧机设备因其高效、安全、稳定的特点&#xff0c;受到了广大机构的青睐。那么…

Biome 1.7 发布,支持从 ESLint 和 Prettier 迁移

近日&#xff0c;Biome v1.7 正式发布&#xff01;这个新版本提供了从 ESLint 和 Prettier 迁移的简单路径。它还引入了格式化程序和 linter 的实验性机器可读报告、新的 linter 规则和许多修复。 使用以下命令更新 Biome&#xff1a; npm install --save-dev --save-exact b…

DSPE-PEG-TPP 磷脂聚乙二醇-磷酸三苯酯 靶向线粒体纳米颗粒药物递送系统

DSPE-PEG-TPP 磷脂聚乙二醇-磷酸三苯酯 靶向线粒体纳米颗粒药物递送系统 【中文名称】磷脂-聚乙二醇-磷酸三苯酯 【英文名称】DSPE-PEG-TPP 【结 构】 【品 牌】碳水科技&#xff08;Tanshtech&#xff09; 【纯 度】95%以上 【保 存】-20℃ 【规 格】50mg,…

windows11 wsl2 ubuntu20.04安装vision mamba并进行测试

windows11 wsl2 ubuntu20.04安装vision mamba 安装流程使用cifar-100测试安装成功 安装流程 vision mamba安装了半天才跑通&#xff0c;记录一下流程在wsl上安装cuda wget https://developer.download.nvidia.cn/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05…

浅析ARM Contex-CM3内核架构

目录 概述 1. Cortex-M3类型MCU 1.1 MCU 架构 1.2 实时性系统概念 1.3 处理器命名法 1.4 MCU的一些知识 2. Cortex-M3 概览 2.1 Cortex-M3综述 2.2 寄存器组 2.3 操作模式和特权极别 2.4 内建的嵌套向量中断控制器 2.5 存储器映射 2.6 总线接口 2.7 存储器保护单元…

Spring Boot 目前还是最先进的吗?

当谈到现代Java开发框架时&#xff0c;Spring Boot一直处于领先地位。它目前不仅是最先进的&#xff0c;而且在Java生态系统中拥有着巨大的影响力。 1. 什么是Spring Boot&#xff1f; Spring Boot是由Spring团队开发的开源框架&#xff0c;旨在简化基于Spring的应用程序的开…

L1-8 刮刮彩票

“刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示&#xff1a; 每次游戏玩家会拿到一张彩票&#xff0c;上面会有 9 个数字&#xff0c;分别为数字 1 到数字 9&#xff0c;数字各不重复&#xff0c;并以 33 的“九宫格”形式排布在彩票上。 在游戏开始时能看见一个位置上…

sql篇-内连接-左连接-右连接

内连接&#xff1a;表1 inner join 表2 on 条件 inner join join&#xff08;简写&#xff09; 查找&#xff1a;满足 匹配两个表条件的记录&#xff1a;student.s_id s.s_id(不匹配的记录不筛选) select * from student inner join score s on student.s_id s.s_id; 查询…

mpeg4标准与 H264标准下QP值间 关系

1 标准对比 MPEG(mpeg1,mpeg2,mpeg4) 与H264 QP值间 关系。 x264vfw 的1pass 是按照 I q:21 P q:24 B q:26 的量化算的,而且在vfw里面不能改变这些参数. 但在mencoder里则可以定义1pass的 qp_constant<1−51> 这个和xvid不同的,xvid一般是用q2跑1pass的,当然你也可以在x2…

Python基于面向对象的图书馆借阅管理系统

应用面向对象程序设计思想,类设计合理。 图书借阅系统功能及设计要求: 主要功能: 1、学生的登陆和注册 2、管理员的登陆和注册3、学生登录后,可以操作书籍的借阅、归还以及查看已借书籍的信息 4、管理员登录后 (1)可以对学生信息进行增加、修改、删除; (2)可以对书籍的…

项目系统名称更改(AntV)

项目系统名称更改&#xff08;AntV&#xff09; 1. 修改文件index.html 文件路径&#xff1a;index.html&#xff0c;修改这两处&#xff0c;即可修改刷新系统时候&#xff0c;浏览器显示的系统名称 2. 修改文件index.js 文件路径&#xff1a;src/config/index.js&#xf…

斯坦福重磅AI报告:中国专利数全球第一 AI还不能完全打败人类

AI浪潮方兴未艾&#xff0c;距chatgpt引爆的变革已过去一年&#xff0c;AI行业发生哪些变化&#xff1f; 4月16日&#xff0c;斯坦福大学“以人为本”人工智能研究所HAI&#xff0c;发布长达501页的《2024年人工智能指数报告》&#xff0c;披露了2023年全球人工智能的发展趋势…

【活动通知】COC 成都 CMeet 系列:2024 WTM 社区(国际妇女节)IWD 活动!

文章目录 前言一、关于 2024 WTM IWD 社区活动二、时间地点三、活动议程及报名方式四、分享嘉宾及主题信息4.1、李然——点燃创造力&#xff0c;重塑未来4.2、何静——乘风破浪&#xff0c;与 AI 的过去、现在、未来式4.3、晓丽老师——用 AI 给女性插上飞翔的翅膀 五、CSDN 成…

网络靶场实战-恶意程序自启动

简介 当恶意程序入侵目标为个人计算机时&#xff0c;相较于服务器&#xff0c;个人计算机对关机或重启操作更加频繁&#xff0c;关机时计算机所有的进程都会被结束&#xff0c;因此恶意程序需要配置自启动来使自己在每次开机时能够被运行。 本篇介绍一个恶意样本(b8090d7d12d…

OCR识别图片的字体与正常的字不同怎么调回来呢?

一般来说&#xff0c;OCR的任务是将图片文字转化成计算机可编辑的文字&#xff0c;一般不识别字体&#xff0c;当然&#xff0c;也不排除某些OCR软件可以识别字体的&#xff0c;具体来说&#xff0c;造成这种现象的可能原因如下&#xff1a; 1. **字体匹配问题**&#xff1a;OC…

【SpringBoot+VUE+ELEMENT 】前后端分离的管理系统的实现——基础功能(记录向)

一个前后端分离的实现。后端使用SpringBoot&#xff0c;前端使用Vue&#xff0c;后端标准的四层结构&#xff0c;前端是用的Element。 一、环境准备 1.安装node.js Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。 成功后cmd中运行 node -v npm -v 出现 对应的版本…