【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;…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
LTR-381RGB-01RGB+环境光检测应用场景及客户类型主要有哪些?
RGB环境光检测 功能,在应用场景及客户类型: 1. 可应用的儿童玩具类型 (1) 智能互动玩具 功能:通过检测环境光或物体颜色触发互动(如颜色识别积木、光感音乐盒)。 客户参考: LEGO(乐高&#x…...
华为云Flexus+DeepSeek征文 | MaaS平台避坑指南:DeepSeek商用服务开通与成本控制
作者简介 我是摘星,一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型,将实际使用经验分享给大家,希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 作者简介 前言 一、技术架构概览 1.1 整体架构设…...
