【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 := subvar 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+ysub := x-yreturn //不用写特定的变量或值,系统会自动返回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运行框架调用
两个问题:
- 全局变量,init函数,main函数的执行顺序
- 多个源文件都有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 += 100y +=50var sum int = x+yfmt.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语言标准文档(中文版)
相关文章:
【Go语言快速上手(二)】 分支与循环函数讲解
💓博主CSDN主页:杭电码农-NEO💓 ⏩专栏分类:Go语言专栏⏪ 🚚代码仓库:NEO的学习日记🚚 🌹关注我🫵带你学习更多Go语言知识 🔝🔝 Go快速上手 1. 前言2. 分支与循环2.1…...
动手写sql 《牛客网80道sql》
第1章:SQL编写基础逻辑和常见问题 基础逻辑 SELECT语句: 选择数据表中的列。FROM语句: 指定查询将要从哪个表中检索数据。WHERE语句: 过滤条件,用于提取满足特定条件的记录。GROUP BY语句: 对结果进行分组。HAVING语句: 对分组后的结果进行条件过滤。O…...
Node.js、Java、Python、PHP在构建BS系统时的特点比较
在现代软件开发领域,构建一个稳定、高效的B/S(浏览器/服务器)系统对于企业的信息化发展至关重要。Node.js、Java、Python和PHP是当下流行的几种后端开发技术,它们各自具有独特的特点和优势。本文将对这几种技术在构建B/S系统时的特…...
快速入门深度学习9.1(用时20min)——GRU
速通《动手学深度学习》9.1 写在最前面九、现代循环神经网络9.1 门控循环单元(GRU)9.1.1. 门控隐状态9.1.1.1. 重置门和更新门9.1.1.2. 候选隐状态9.1.1.3. 隐状态 9.1.3 API简洁实现小结 🌈你好呀!我是 是Yu欸 🌌 20…...
基于51单片机的步进电机调速系统设计
基于51单片机的步进电机调速系统 (仿真+程序+原理图+设计报告) 功能介绍 具体功能: 1.按键可以控制电机正、反转,加、减速,停止; 2.一位7段数码管实时显示档位…...
postcss概述
PostCSS是一个用于转换CSS的工具,它使用插件来处理CSS,并提供了一种方式来编写可扩展的CSS代码。其主要特点如下: 插件驱动:PostCSS的核心非常轻量级,大部分功能都是通过插件来实现的。这意味着用户可以根据项目的需求…...
【Proteus】51单片机对直流电机的控制
直流电机:输出或输入为直流电能的旋转电机。能实现直流电能和机械能互相转换的电机。把它作电动机运行时是直流电动机,电能转换为机械能;作发电机运行时是直流发电机,机 械能转换为电能。 直流电机的控制: 1、方向控制…...
JET毛选学习笔记:如何利用《实践论》学习实验
一、个人背景介绍 本人本科读的是预防医学专业(因为没考上临床),硕博连读(报名人少,我报了就得了)的时候专业是流行病与卫生统计学,除了学习流行病学、统计学(忘得差不多了…...
FinalShell 远程连接 Linux(Ubuntu)系统
Linux 系列教程: VMware 安装配置 Ubuntu(最新版、超详细)FinalShell 远程连接 Linux(Ubuntu)系统Ubuntu 系统安装 VS Code 并配置 C 环境 ➡️➡️➡️提出一个问题:为什么使用 FinalShell 连接࿰…...
Python零基础从小白打怪升级中~~~~~~~多线程
线程安全和锁 一、全局解释器锁 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。 GIL全称global interpreter lock,全局解释器锁。 每个线程在执行的时候都需要先获取GIL,保证同一时刻只…...
【机器学习300问】67、均方误差与交叉熵误差,两种损失函数的区别?
一、均方误差(Mean Squared Error, MSE) 假设你是一个教练,在指导学生射箭。每次射箭后,你可以测量子弹的落点距离靶心的差距(误差)。MSE就像是计算所以射击误差的平方后的平均值。它强调了每一次偏离靶心的…...
SAP打印输出设置
SAP打印输入有很多方式,适合不同的应用场景。 一.打印输出总体概览图 二.前台打印 这个是比较常见的,前端打印的出现减轻了管理员的工作量,用户可以选择自己电脑上的打印机输出,不需要所有打印机都在SAP平台中进行配置࿰…...
qt对json文件下,qdatetime时间的正确读写方式
qt 对json文件下qdatetime时间的正确读写方式 被搞了很长时间,最后发现是需要控制格式。 正确方式 // read QByteArray localBytes mapJson["playTime"].toString().toLocal8Bit(); char* char_time localBytes.data(); std::string str_time char_…...
【系统分析师】计算机网络
文章目录 1、TCP/IP协议族1.1 DHCP协议1.2 DNS协议1.3网络故障诊断 2、网路规划与设计2.1逻辑网络设计2.2物理网络设计2.3 分层设计 3、网络接入3.1 接入方式3.2 IPv6地址 4、综合布线技术5、物联网5.1物联网概念与分层5.2 物联网关键技术 6、云计算7、网络存储技术(…...
DDoS攻击愈演愈烈,谈如何做好DDoS防御
DDoS攻击是目前最常见的网络攻击方式之一,各种规模的企业包括组织机构都在受其影响。对于未受保护的企业来讲,每次DDoS攻击的平均成本为20万美元。可见,我们显然需要开展更多的DDoS防御工作。除考虑如何规避已发生的攻击外,更重要…...
48.基于SpringBoot + Vue实现的前后端分离-雪具销售系统(项目 + 论文PPT)
项目介绍 本站是一个B/S模式系统,采用SpringBoot Vue框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得基于SpringBoot Vue技术的雪具销售系统设计与实现管理工作系统…...
P8715 [蓝桥杯 2020 省 AB2] 子串分值 (双边检测)
# [蓝桥杯 2020 省 AB2] 子串分值 ## 题目描述 对于一个字符串 $S$, 我们定义 $S$ 的分值 $f(S)$ 为 $S$ 中恰好出现一次的字符个数。例如 $f\left({ }^{\prime \prime} \mathrm{aba}{ }^{\prime \prime}\right)1$,$f\left({ }^{\prime \prime} \mathrm{abc}{ }^{…...
(十四)C++自制植物大战僵尸游戏windows平台视频播放实现
植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/8UFMs VLC库 在Cocos2d-x游戏开发框架中,没有实现windows平台视频播放的功能,需要自定义实现。在本项目中使用vlc库实现windows平台的视频播放功能。 vlc官网:网址 下载完成后&#x…...
深入理解GCC/G++在CentOS上的应用
文章目录 深入理解GCC/G在CentOS上的应用编译C和C源文件C语言编译C语言编译 编译过程的详解预处理编译汇编链接 链接动态库和静态库静态库和动态库安装静态库 结论 深入理解GCC/G在CentOS上的应用 在前文的基础上,我们已经了解了CentOS的基本特性和如何在其上安装及…...
C语言【复合类型(自定义类型)】
一、结构体 结构体(struct)可以理解为用户自定义的特殊的复合的“数据类型”; 1. 结构体变量的定义和初始化 定义结构体变量的方式: 先声明结构体类型再定义变量名 在声明类型的同时定义变量 // 结构体类型的定义 struct stu {char name[50];int age;…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
