Go开始:Go基本元素介绍
目录
- 标识符与关键字
- Go中的标识符
- Go关键字
- 关键字示例
- 具名的函数
- 常规函数
- 代码示例
- 方法
- 代码示例
- 高阶函数
- 代码示例
- 匿名函数与Lambda表达式
- 代码示例
- 闭包
- 代码示例
- 具名的值
- 变量
- 基本数据类型
- 复合数据类型
- 指针类型
- 常量
- 基本常量类型
- 枚举常量
- 常量表达式
- 定义类型和类型别名
- 类型定义(Type Definition)
- 基础类型
- 复合类型
- 接口类型
- 类型别名(Type Alias)
- 类型定义与类型别名的区别
- 代码示例
- 包和模块管理
- 包(Packages)
- 标准库包
- 自定义包
- 包的可见性
- 模块(Modules)
- 初始化模块
- 添加依赖
- 升级和降级依赖
- 代码块与断行
- 代码块(Code Blocks)
- 函数体
- 控制结构
- 声明块
- 断行(Line Breaks)
- 语句结束
- 长语句的断行
- 函数调用和定义
- 总结
本文深入探讨了Go编程语言中的核心概念,包括标识符、关键字、具名函数、具名值、定义类型、类型别名、包和模块管理,以及代码块和断行。这些元素是构成Go程序的基础,也是编写高质量代码的关键。
关注TechLeadCloud,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。
在Go编程中,代码元素是构建软件的基础。本文旨在深入探讨Go语言中的各种代码元素,包括函数、变量、类型和更多。我们还会涉及如何通过包(package)来组织这些元素,以及Go的关键字和标识符规则。
标识符与关键字
在任何编程语言中,标识符和关键字都是核心概念,Go也不例外。标识符用于命名各种类型的代码元素,如变量、常量、函数等。关键字是预留的词汇,用于指示编程语言的特定操作。在本部分中,我们将详细介绍Go语言中的标识符和关键字。
Go中的标识符
标识符是用于标识各种程序实体(例如变量、函数、类型等)的名称。在Go中,标识符遵循以下规则:
- 必须以字母或下划线(
_
)开头。 - 可以包含字母、数字和下划线(
_
)。 - 区分大小写。
例如,以下都是有效的Go标识符:
name
_x9
go_variable
Count123
以下是无效的标识符:
9name // 以数字开头
!var // 包含非法字符
Go关键字
Go语言有25个预留的关键字,不能用作标识符。以下是这些关键字的列表以及它们的简要解释:
break 用于中断循环或switch语句
default 用于switch语句,表示默认情况
func 定义新的函数
interface 定义接口
select 用于处理多个通道
case 用于switch和select语句中的条件分支
defer 用于确保函数调用在程序执行结束后发生
go 用于并发执行
map 定义map类型
struct 定义结构体
chan 定义通道类型
else 用于if-else结构
goto 用于无条件跳转
package 定义包
switch 用于多路分支
const 定义常量或常量组
fallthrough 用于switch语句,使得控制流穿透到下一个case
if 条件语句
range 用于循环遍历数组、切片、字符串、map或通道
type 定义新的数据类型或类型别名
continue 跳过当前循环的剩余部分,开始下一次迭代
for 循环语句
import 导入包
return 从函数返回
var 声明变量
关键字示例
// 使用if-else关键字
if x > 10 {fmt.Println("x is greater than 10")
} else {fmt.Println("x is not greater than 10")
}// 使用for关键字
for i := 0; i < 5; i++ {fmt.Println(i)
}// 使用func和return关键字
func add(a int, b int) int {return a + b
}
具名的函数
在Go语言中,函数是一组执行特定任务的代码块,具名函数即是有名称的函数。本文将详细讨论Go中各类具名函数,包括常规函数、方法、高阶函数、匿名函数和闭包。
常规函数
这是最基础的函数类型。常规函数具有名称,可以接受参数,并且可以返回值。
代码示例
// 常规函数,接受两个int类型参数,返回int类型值
func add(a int, b int) int {return a + b
}
方法
在Go中,方法是一种特殊类型的函数,它作用于特定类型的变量,这个特定类型称为接收者。
代码示例
type Circle struct {Radius float64
}// Circle类型的方法,计算圆的面积
func (c Circle) Area() float64 {return 3.14159 * c.Radius * c.Radius
}
高阶函数
高阶函数是接受函数作为参数或返回一个函数的函数。
代码示例
// 高阶函数,接受一个函数作为参数
func applyFunc(f func(int) int, value int) int {return f(value)
}
匿名函数与Lambda表达式
匿名函数是没有名字的函数,通常用于临时操作。
代码示例
// 匿名函数
add := func(a, b int) int {return a + b
}
闭包
闭包是一个函数值,它引用了其函数体之外的变量。简单来说,这个函数“记住了”这些引用的变量。
代码示例
// 闭包示例
func outer() func() int {x := 0return func() int {x++return x}
}
具名的值
在Go语言中,具名的值主要包括变量和常量。这些都是用于存储数据或代表特定值的标识符。接下来,我们会分别探讨变量和常量的各种类型和用法。
变量
变量是用于存储数据的容器。在Go中,变量的声明有多种方式,并且支持多种数据类型。
基本数据类型
Go支持一系列基本的数据类型,包括整数、浮点数、布尔值、字符串等。
var i int = 10 // 整数
var f float64 = 10.5 // 浮点数
var b bool = true // 布尔值
var s string = "hello" // 字符串
复合数据类型
Go还提供了数组、切片、映射(Map)、结构体(Struct)等复合数据类型。
var arr [3]int = [3]int{1, 2, 3} // 数组
var slice []int = []int{1, 2, 3} // 切片
var m map[string]int = map[string]int{"a": 1, "b": 2} // 映射
type Person struct {Name string; Age int} // 结构体
指针类型
Go语言也支持指针,但不支持指针运算。
var p *int
i := 42
p = &i
常量
与变量不同,常量是不可变的值,一旦声明,就不能更改。
基本常量类型
const pi float64 = 3.14159 // 浮点数常量
const str string = "Hello" // 字符串常量
const b bool = true // 布尔常量
枚举常量
在Go中,可以使用iota
关键字生成一组增量的整数常量,通常用于枚举。
type Weekday int
const (Sunday Weekday = iotaMondayTuesday
)
常量表达式
Go支持常量表达式,允许用于计算的常量值在编译期间进行运算。
const x = 2 + 3
定义类型和类型别名
Go语言不仅提供了一系列内建类型,还允许通过type
关键字定义新的类型或为现有的类型创建别名。这两者在语法上可能相似,但在类型系统中有不同的意义和用途。本篇文章旨在详细介绍定义类型和类型别名的各种情况。
类型定义(Type Definition)
通过类型定义,你可以创建一个全新的类型,尽管它可能与某个现有类型在结构上完全相同。
基础类型
下面是如何定义一个基于int
的新类型MyInt
:
type MyInt int
复合类型
也可以基于复合类型来定义新类型:
type MyMap map[string]int
type Person struct {Name stringAge int
}
接口类型
你还可以定义接口类型,它包含了一组方法签名:
type Writer interface {Write([]byte) (int, error)
}
类型别名(Type Alias)
类型别名并不创建新类型,只是为现有类型创建一个新名字。
type Integer = int
类型定义与类型别名的区别
类型定义和类型别名在Go中有着本质的区别。
- 类型定义会创建一个全新的类型,它与其基础类型在类型系统中是完全不同的。
- 类型别名只是创建了一个新名称,但并没有创建新类型。
代码示例
type MyInt int
type YourInt = intvar a int
var b MyInt
var c YourInta = 1
b = MyInt(a) // 需要显式转换
c = a // 不需要转换,因为YourInt只是int的别名
包和模块管理
Go语言通过包(Packages)和模块(Modules)来组织和管理代码。这两者虽然在目的上有些许相似,但在用法和规模上各有特点。在本篇文章中,我们将深入探讨Go中的包和模块管理,以及如何高效地使用它们。
包(Packages)
包是Go语言代码组织的基本单位。每个Go程序都是由包组成的,包用于封装代码以实现可重用和可维护。
标准库包
Go语言提供了丰富的标准库,例如 fmt
, net/http
, io
等。
import "fmt"func main() {fmt.Println("Hello, world!")
}
自定义包
你也可以创建自定义的包。通常情况下,每个文件夹就是一个单独的包。
例如,创建一个名为 mathutils
的包:
// mathutils/add.go
package mathutilsfunc Add(a, b int) int {return a + b
}
使用自定义包:
import "mathutils"func main() {sum := mathutils.Add(1, 2)
}
包的可见性
在Go中,以大写字母开头的函数或变量在包外是可见的(Public),以小写字母开头的则不是(Private)。
模块(Modules)
模块是包的集合。Go 1.11版本引入了模块的概念,旨在解决依赖管理问题。
初始化模块
使用 go mod init
初始化一个新模块。
go mod init mymodule
这将生成一个 go.mod
文件,其中列出了模块名和依赖。
添加依赖
当你导入一个新的包并运行 go build
或 go get
,依赖将自动添加到 go.mod
文件。
升级和降级依赖
你可以使用 go get
命令升级或降级模块依赖。
go get -u example.com/some/module@v1.2.3
代码块与断行
在Go编程中,理解如何有效地使用代码块和断行是编写可读、可维护代码的基础。在本篇文章中,我们将深入了解Go语言中各种类型的代码块和断行规则。
代码块(Code Blocks)
代码块是由一对大括号{}
包围的代码序列。这些代码块在不同的语境中有不同的作用。
函数体
最常见的代码块是函数体,它包含函数的实现。
func sayHello() {fmt.Println("Hello!")
}
控制结构
if
、for
、switch
等控制结构也使用代码块。
if true {fmt.Println("This is true.")
}for i := 0; i < 3; i++ {fmt.Println(i)
}
声明块
常量和变量也可以在块内声明。
const (Pi = 3.14E = 2.71
)
断行(Line Breaks)
Go语言相对宽松的断行规则让你可以在多数表达式和声明中自由地添加空白和换行。
语句结束
在Go中,大多数语句通过换行符或者分号来结束。
fmt.Println("This is the end of the statement")
长语句的断行
对于较长的语句,Go允许在操作符附近断行。
result := someVeryLongVariable +anotherVeryLongVariable -yetAnotherVeryLongVariable
函数调用和定义
在函数调用或定义时,参数也可以进行断行。
func longFunction(param1 int,param2 string,param3 float64,
) {// 函数体
}
总结
通过深入探讨Go语言的标识符、关键字、具名函数、具名值、定义类型、类型别名、包和模块管理,以及代码块和断行,本系列文章旨在提供一个全面且深入的视角来理解Go编程的各个方面。这些元素共同构成了Go语言的基础架构,熟练掌握它们是编写可维护、高效和可扩展代码的关键。希望这些内容能够帮助你在Go编程道路上更进一步,敬请期待我们接下来更多的深入文章和教程。
关注TechLeadCloud,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。
相关文章:
Go开始:Go基本元素介绍
目录 标识符与关键字Go中的标识符Go关键字关键字示例 具名的函数常规函数代码示例 方法代码示例 高阶函数代码示例 匿名函数与Lambda表达式代码示例 闭包代码示例 具名的值变量基本数据类型复合数据类型指针类型 常量基本常量类型枚举常量常量表达式 定义类型和类型别名类型定义…...
十二、【漏洞复现】Rails任意文件读取(CVE-2019-5418)
十二、【漏洞复现】Rails任意文件读取(CVE-2019-5418) 12.1、漏洞原理 Ruby on Rails是一个使用 Ruby 语言写的开源 Web 应用框架,它是严格按照 MVC 结构开发的。它努力使自身保持简单,来使实际的应用开发时的代码更少,使用最少…...
【计算机视觉|人脸建模】学习从4D扫描中获取的面部形状和表情的模型
本系列博文为深度学习/计算机视觉论文笔记,转载请注明出处 标题:Learning a model of facial shape and expression from 4D scans 链接:Learning a model of facial shape and expression from 4D scans | ACM Transactions on Graphics Pe…...
【ADB】蓝牙总结
ADB 打开蓝牙关闭蓝牙打开Setting查看蓝牙地址查看蓝牙名称查看蓝牙是否开启车机蓝牙Setting配置路径wifi 打开蓝牙 adb root adb shell svc bluetooth enable 关闭蓝牙 adb root adb shell bluetooth disable 打开Setting adb shell am start -n com.android.settings/.S…...
嵌入式系统设计与应用---ARM处理器体系结构(学习笔记)
ARM处理器概述 Cortex-A8处理器工作模式 ps:除用户模式以外的其他模式被称为非用户模式或特权模式;除用户模式及系统模式以外的其他模式可称为异常模式 Cortex-A8存储器管理 ARM的基本数据类型 字节(Byte)&#…...
计算机竞赛 身份证识别系统 - 图像识别 深度学习
文章目录 0 前言1 实现方法1.1 原理1.1.1 字符定位1.1.2 字符识别1.1.3 深度学习算法介绍1.1.4 模型选择 2 算法流程3 部分关键代码 4 效果展示5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计 图像识别 深度学习 身份证识别…...
StarRocks数据导入
1、相关环境 Flink作为当前流行的流式计算框架,在对接StarRocks时,若直接使用JDBC的方式"流式"写入数据,对StarRocks是不友好的,StarRocks作为一款MVCC的数据库,其导入的核心思想还是"攒微批降频率&qu…...
JavaSE | 初识Java(一) | JDK \ JRE \ JVM
Java初识 Java 是一门半编译型、半解释型语言。先通过 javac 编译程序把源文件进行编译,编译后生成的 .class 文件是由字节 码组成的平台无关、面向 JVM 的文件。最后启动 java 虚拟机 来运行 .class 文件,此时 JVM 会将字节码转换成平台能够理…...
6轮面试阿里Android开发offer,薪资却从21k降到17k,在逗我?
一小伙工作快3年了,拿到了阿里云Android开发岗位P6的offer,算HR面一起,加起来有6轮面试了,将近3个月的时间,1轮同级 1轮Android用人部门leader 1轮Android 组leader 1轮项目CTO 1轮HR 1轮HRBP。 一路上各种事件分…...
基于混合蛙跳优化的BP神经网络(分类应用) - 附代码
基于混合蛙跳优化的BP神经网络(分类应用) - 附代码 文章目录 基于混合蛙跳优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.混合蛙跳优化BP神经网络3.1 BP神经网络参数设置3.2 混合蛙跳算法应用 4.测试结果…...
[架构之路-230]:计算机硬件与体系结构 - 可靠性、可用性、稳定性;MTTF、MTTR、MTBF
目录 一、软件质量属性 二、可靠性、可用性、稳定性区别 2.1 比较 2.2 公式比较 2.3 "正常工作时间"和"正常运行时间" 2.4 比较案例 2.5 可用性好但可靠性较差的示例 三、MTTF、MTTR、MTBF 3.1 图示 3.2 定义 (1)MTTF&am…...
selenium自动化测试环境安装教程
0X00前言: Selenium是一个广泛应用于Web应用程序测试的工具。它提供了一组功能强大的API,用于模拟用户与Web浏览器的交互。以下是对Selenium的简要介绍: 功能:Selenium能够自动化执行各种Web浏览器上的操作,如点击、输…...
如何修改springboot项目启动时的默认图标?
如下所示为springboot项目启动时的默认图标,我们可以把它换成我们自己喜欢的图片 方法如下: 第一步:我们需要将图片放置当前项目的resources目录下 如下所示为我自定义的一张照片 第二步: 方法1:在application.properties文件中…...
基于阴阳对优化的BP神经网络(分类应用) - 附代码
基于阴阳对优化的BP神经网络(分类应用) - 附代码 文章目录 基于阴阳对优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.阴阳对优化BP神经网络3.1 BP神经网络参数设置3.2 阴阳对算法应用 4.测试结果&#x…...
Spring bean定义Spring Bean 的作用域
Spring bean定义 目录 Spring bean定义 Spring配置元数据 Spring Bean 的作用域 singleton作用域: 原型作用域: 示例: 形成应用程序的骨干是由Spring IoC容器所管理的对象称为bean。bean被实例化,组装,并通过Sprin…...
代码随想录 动态规划 part16
583. 两个字符串的删除操作 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 思路:dp[i][j]数组表示使得 word1[:i] 和 word2[:j] 相同所需的最小步数。当word1[i-1]word2[…...
非 Prop 的属性
概念 父组件传给子组件的属性,但该属性没有在子组件 props 属性里定义。 属性继承 非 Prop 的属性默认情况下会被子组件的根节点继承,非 prop 的属性会保存在子组件 $attrs 属性里。 举例 子组件 date-picker 如下 <!-- 我是子组件 date-picker --&…...
初识Java 12-3 流
目录 终结操作 将流转换为一个数组(toArray) 在每个流元素上应用某个终结操作(forEach) 收集操作(collect) 组合所有的流元素(reduce) 匹配(*Match) 选…...
代码随想录算法训练营第42天|动态规划:01背包理论基础、动态规划:01背包理论基础(滚动数组)、416. 分割等和子集
动态规划:01背包理论基础 动态规划:01背包理论基础(滚动数组) 以上两个问题的代码未本地化保存 416. 分割等和子集 https://leetcode.cn/problems/partition-equal-subset-sum/ 复杂的解法 class Solution { public:bool ca…...
(详解)Linux常见基本指令(1)
目录 目录: 1:有关路径文件下的操作(查看,进入) 1.1 ls 1.2 pwd 1.3 cd 2:创建文件或目录 2.1 touch 2.2 mkdir 3:删除文件或目录 3.1 rm与rmdir 4:复制剪切文件 4.1 cp 4.2 mv 1:有关路径的操作 1 ls 指令 语法:ls [选项] [目录或文…...
紫光同创FPGA图像视频采集系统,提供2套PDS工程源码和技术支持
目录 1、前言免责声明 2、紫光同创FPGA相关方案推荐3、设计思路框架视频源选择OV7725摄像头配置及采集OV5640摄像头配置及采集动态彩条HDMA图像缓存输入输出视频HDMA缓冲FIFOHDMA控制模块 HDMI输出 4、PDS工程1详解:OV7725输入5、PDS工程2详解:OV5640输入…...
第一章 函数 极限 连续(解题方法须背诵)
(一)求极限的常用方法 方法1 利用有理运算法则求极限 方法2 利用基本极限求极限 方法3 利用等价无穷小求极限 方法4 利用洛必达法则求极限 方法5 利用泰勒公式求极限 方法6 利用夹逼准则求极限 方法7 利用定积分的定义求极限 方法8 利用单调有界…...
selenium +IntelliJ+firefox/chrome 环境全套搭配
1第一步:下载IntelliJ idea 代码编辑器 2第二步:下载浏览器Chrome 3第三步:下载JDK 4第四步:配置环境变量(1JAVA_HOME 2 path) 5第五步:下载Maven 6第六步:配置环境变量&#x…...
CentOS 7 停止维护后如何平替你的生产系统?
Author:rab 目录 前言一、Debian 家族1.1 Debian1.2 Ubuntu 二、RHEL 家族2.1 Red Hat Enterprise Linux2.2 Fedora2.3 CentOS2.4 Rocky Linux2.5 AlmaLinux 三、如何选择?思考? 前言 CentOS 8 系统 2021 年 12 月 31 日已停止维护服务&…...
第81步 时间序列建模实战:Adaboost回归建模
基于WIN10的64位系统演示 一、写在前面 这一期,我们介绍AdaBoost回归。 同样,这里使用这个数据: 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndr…...
135.【JUC并发编程_01】
JUC 并发编程 (一)、基本概述1.概述 (二)、进程与线程1.进程与线程(1).进程_介绍(2).线程_介绍(3).进程与线程的区别 2.并行和并发(1).并发_介绍(2).并行_介绍(3).并行和并发的区别 3.应用(1).异步调用_较少等待时间(2).多线程_提高效率 (三)、Java 线程1.创建线程和运行线程(1…...
VC++创建windows服务程序
目录 1.关于windows标准可执行程序和服务程序 2.服务相关整理 2.1 VC编写服务 2.2 服务注册 2.3 服务卸载 2.4 启动服务 2.5 关闭服务 2.6 sc命令 2.7 查看服务 3.标准程序 3.1 后台方式运行标准程序 3.2 查找进程 3.3 终止进程 以前经常在Linux下编写服务器程序…...
连续爆轰发动机
0.什么是爆轰 其反应区前沿为一激波。反应区连同前驱激波称为爆轰波。爆轰波扫过后,反应区介质成为高温高压的爆轰产物。能够发生爆轰的系统可以是气相、液相、固相或气-液、气-固和液-固等混合相组成的系统。通常把液、固相的爆轰系统称为炸药。 19世纪80年代初&a…...
交通物流模型 | 基于时空注意力融合网络的城市轨道交通假期短时客流预测
短时轨道交通客流预测对于交通运营管理非常重要。新兴的深度学习模型有效提高了预测精度。然而,大部分现有模型主要针对常规工作日或周末客流进行预测。由于假期客流的突发性和无规律性,仅有一小部分研究专注于假期客流预测。为此,本文提出一个全新的时空注意力融合网络(ST…...
2.2.1 嵌入式工程师必备软件
1 文件比较工具 在开发过程中,不论是对代码的对比,还是对log的对比,都是必不可不少的,通过对比,我们可以迅速找到差异,定位问题。当前常用的对比工具有:WinMerge,Diffuse,Beyond Compare,Altova DiffDog,AptDiff,Code Compare等。这里推荐使用Beyond Compare,它不…...
宁德做网站/seo是指什么
在Matlab中,大多时候,我们都是用M语言,输入系统的传递函数后,用bode函数绘制bode图对系统进行频率分析,这样做,本人觉得效率远不如Simulink建模高。如何在Matlab/Simulink中画bode图,以前也在网…...
恩施做网站/腾讯企点账户中心
Spring事务Transaction配置的五种注入方式详解 标签: Spring事务Transaction配置2014-06-04 09:53 22129人阅读 评论(2) 收藏 举报分类:J2EE(95) spring(67) 事务版权声明:本文为博主原创文章…...
做日本贸易哪个网站好/福州网站建设策划
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页 [作者:高健博客园 luckyjackgaogmail.com] 资料来源: HOT Inside: Th…...
惠来网站建设/网络推广公司收费标准
在写python程序时用到的,但是检查之后发现并没有少参数,然后经过一番搜索,发现需要在函数的参数里面加上self,这样就不会报错了,但是有些函数里面没有加也能运行,具体原因未知。 求大佬解答...
diy做网站/公司官网怎么制作
Java与C之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项技术当做Java语…...
深圳做网站j华信科/域名大全查询
我们可以使用push将元素追加到数组中。push接受可变数量的参数,我们可以一次推送多个元素。但是,如果我们传递一个数组来推送,它实际上会将该数组作为单个元素添加,而不是单独添加元素,我们最终得到一个数组内的数组。…...