
2.2?设置环境变量2.3?验证安装三、基础语法3.1?变量定义和赋值3.2?类型别名3.3?常量3.4?控制流语句3.4.1?条件语句if3.4.2?switch语句3.4.3?循环语句for3.4.4?无限循环语句for without conditions3.4.5?跳转语句break3.4.6?返回语句return3.4.7?错误处理defer3.5 函数定义和调用3.6 数组和切片3.7 映射3.8 结构体3.9 方法3.10 并发编程3.10.1 goroutine3.10.2 channel* * *##### 一、概述###### 1.1 Go语言的起源和设计理念Go语言或 Golang起源于2007年并在2009年正式对外发布。Go是非常年轻的一门语言它的主要目标是兼具Python等动态语言的开发速度和C/C等编译型语言的性能与安全性。Go语言是编程语言设计的又一次尝试是对类C语言的重大改进它不但能让你访问底层操作系统还提供了强大的网络编程和并发编程支持。Go语言的设计理念是不损失应用程序性能的情况下降低代码的复杂性旨在创造一种新的编程语言既能够保持C和C的效率又能够拥有像Python和Ruby的灵活性和易读性###### 1.2Go语言的特性和应用领域Go语言的特性和应用领域如下121.高效性Go语言是一种编译型语言可以在不牺牲程序执行速度的前提下减少内存占用提高程序的运行效率。2.并发性Go语言天生支持并发编程其goroutine机制使得开发者可以轻松地实现并发处理提高了程序的并发性和执行效率。3.简单性Go语言的语法简单易学代码可读性高很容易上手。4.安全性Go语言提供了内存安全和类型安全等特性可以有效地避免内存泄漏和类型错误等问题。5.应用领域Go语言适用于开发大型软件和Web服务器尤其是需要处理大量数据和并发请求的场景如云计算、分布式系统等领域。##### 二、环境配置###### 2.1下载和安装1. 访问Go语言官网https://golang.org/dl/并根据自己电脑系统下载适合的版本。2. 将下载好的包解压缩到你想要安装的目录下如/usr/local/go###### 2.2设置环境变量打开终端并输入以下命令来添加环境变量 export GOROOT/usr/local/go export PATHP A T H : PATH:PATH:GOROOT/bin 其中**GOROOT是Go语言的安装路径PATH**是环境变量中的一个路径用于寻找Go命令。###### 2.3验证安装1. 安装一个编辑器例如Visual Studio Code或Sublime Text等。2. 使用编辑器创建一个Hello World程序保存为hello.go。 package main import “fmt” func main() { fmt.Println(“Hello, World!”) } 3.在终端中进入Hello World程序所在的目录输入以下命令 go run hello.go 如果一切正常终端中应该输出“Hello, World”##### 三、基础语法###### 3.1变量定义和赋值在Go语言中可以使用关键字var来定义变量并使用赋值运算符对变量进行赋值。例如定义一个整数类型的变量并赋值为10的语句如下 var age int 10 在上面的语句中var关键字用于声明一个变量age是变量的名称int是变量的类型是赋值运算符将10赋给变量age。除了直接赋值还可以使用类型推导来定义变量例如 var name “Alice” 在上面的语句中变量name的类型会被自动推导为字符串类型并将字符串Alice赋值给变量name。还可以使用简短声明方式来定义和赋值变量例如 age : 20 在上面的语句中:是简短赋值运算符表示将20赋值给新声明的变量age。由于没有明确指定变量的类型因此编译器会根据右侧表达式的值来自动推导变量的类型。需要注意的是在Go语言中变量名必须以字母或下划线开头不能以数字开头。此外变量名是区分大小写的。###### 3.2类型别名Go语言中的类型别名就是为已存在的类型定义一个别名使用type关键字来定义语法为type TypeAlias Type。类型别名是Go 1.9版本添加的新功能主要用于解决代码升级、迁移中存在的类型兼容性问题在C/C语言中代码重构升级可以使用宏快速定义新的一段代码Go语言中没有选择加入宏而是解决了重构中最麻烦的类型名变更问题1。例如定义一个整数类型的别名Age type Age int 那么Age就是int类型的别名。以后凡是使用Age的地方都可以使用int代替。###### 3.3常量在Go语言中常量是一种不可变的值。常量是在编译时就确定且在运行时不能被修改的量。常量可以是任何基本类型如整数、浮点数、布尔值、字符串或常量表达式。定义常量的语法如下 const constantName value 其中constantName是常量的名称遵循标识符命名规则value是常量的值。例如定义一个整数类型的常量Pi并赋值为3.14 const Pi 3.14 常量在编译时会被计算因此可以在编译期间进行类型检查和类型推断###### 3.4控制流语句在Go语言中控制流语句用于控制程序的执行流程。以下是一些常用的控制流语句###### 3.4.1条件语句if根据条件执行不同的代码块 if condition { // 如果条件为真执行这里的代码块 } else if condition2 { // 如果条件为假检查条件2如果条件2为真执行这里的代码块 } else { // 如果条件和条件2都为假执行这里的代码块 } ###### 3.4.2switch语句根据不同的条件执行不同的代码块 switch expression { case value1: // 当expression等于value1时执行的代码块 case value2: // 当expression等于value2时执行的代码块 … default: // 当expression不等于任何一个case值时执行的代码块 } ###### 3.4.3循环语句for重复执行同一段代码 for initialization; condition; post { // 执行循环体 } ###### 3.4.4无限循环语句for without conditions无限循环除非使用break语句跳出循环 for { // 无限循环除非使用break语句跳出循环 } ###### 3.4.5跳转语句break用于跳出循环或switch语句 break; // 跳出当前循环或switch语句 ###### 3.4.6返回语句return从函数中返回值 return value; // 返回一个值给调用者 ###### 3.4.7错误处理defer延迟执行某些代码通常用于资源清理 defer func() { // 延迟执行的代码通常用于资源清理操作 }() Go语言中还有一些更详细的控制流语句包括空语句empty statement、无限循环语句infinite loop、标签和goto语句。由于篇幅有限不再一一列举有兴趣可自行学习。###### 3.5 函数定义和调用在Go语言中函数是一种可重复使用的代码块用于执行特定的任务。函数定义指定了函数的名称、参数和返回值而函数调用则是执行函数的过程。下面是一个简单的函数定义和调用的示例 package main import “fmt” // 函数定义 func greet(name string) string { return Hello, name “!” } func main() { // 函数调用 fmt.Println(greet(“Alice”)) fmt.Println(greet(“Bob”)) } 在上面的代码中我们定义了一个名为greet的函数它接受一个字符串参数name并返回一个带有问候语的字符串。在main函数中我们通过调用greet函数并传递不同的参数来打印不同的问候语。在函数定义中函数的名称指定了函数的名称参数列表指定了函数接受的输入参数的类型和名称而返回值列表指定了函数返回值的类型和名称。函数的定义以关键字func开头后面跟着函数名称、参数列表和返回值列表。在函数调用中我们使用函数名称加上参数列表的方式来执行函数。参数列表中的参数数量和类型必须与函数定义中的参数列表匹配。调用函数后返回的结果可以直接使用也可以通过变量接收。**请注意**在Go语言中函数的定义可以出现在任何地方但通常建议将函数定义放在package级别以下。同时函数名称的命名应该具有描述性以便于阅读和理解。###### 3.6 数组和切片在Go语言中数组和切片是常用的数据结构它们有一些共同点和区别。数组的定义方式如下 var arr [n]type 其中n表示数组的长度type表示数组元素的类型。例如定义一个包含5个整数的数组 var arr [5]int 可以通过索引访问数组元素例如 arr[0] 10 fmt.Println(arr[0]) // 输出10切片的定义方式如下 var slice []type 其中type表示切片元素的类型。切片是一个动态长度的序列可以通过追加元素来扩展。例如创建一个包含3个整数的切片 var slice []int slice append(slice, 10, 20, 30) 可以通过索引访问切片元素例如 slice[0] 10 fmt.Println(slice[0]) // 输出10 数组和切片的区别在于动态性和长度。数组的长度是固定的不能改变而切片的长度可以动态增长。此外切片还有一些内置的方法和操作例如len()和append()函数这些方法在数组中不可用。需要注意的是切片在创建时可以指定初始容量例如 var slice []int make([]int, 5, 10) 这将创建一个初始长度为5容量为10的切片。当切片的容量不足以容纳更多的元素时切片会自动扩容。###### 3.7 映射在Go语言中映射Map是一种无序的键值对集合。它使用一个哈希表实现提供了一种将键映射到值的方式。映射的定义方式如下 var m map[keyType]valueType 其中keyType表示键的类型valueType表示值的类型。以下是一个使用映射的示例 package main import “fmt” func main() { // 创建一个映射 m : make(map[string]int) // 添加键值对 m[“apple”] 1 m[“banana”] 2 m[“orange”] 3 // 访问映射的值 fmt.Println(m[“apple”]) // 输出1 // 删除映射中的键值对 delete(m, “banana”) // 遍历映射 for key, value : range m { fmt.Println(key, value) } } 在上述示例中我们首先使用make函数创建了一个映射m然后通过key来添加、访问和删除映射中的值。使用delete函数可以删除指定键值对。最后使用range循环遍历映射并打印键值对。###### 3.8 结构体Go语言中的结构体struct是一种自定义数据类型可以将多个基本数据类型组合到一起形成一个自定义的复合数据类型。结构体的定义语法如下 type 结构体名称 struct { 字段1 字段1类型 字段2 字段2类型 … } 结构体中的字段名必须唯一每个字段对应一个成员变量。结构体的定义和使用方法类似于C中的结构体。下面是一个简单的示例 package main import “fmt” // 定义结构体 type Person struct { Name string Age int } func main() { // 声明结构体变量 var p Person // 直接赋值 p.Name “Alice” p.Age 20 // 通过成员访问运算符访问结构体成员变量 fmt.Println(p.Name) // 输出Alice fmt.Println(p.Age) // 输出20 } 结构体可以定义在函数内部或函数外部定义位置影响到结构体的访问范围。如果结构体定义在函数外面结构体名称首字母是否大写影响到结构体是否能跨包访问。如果结构体能跨包访问属性首字母是否大写影响到属性是否跨包访问。通过结构体可以封装多个变量实现面向对象编程。###### 3.9 方法在Go语言中方法method是一种与特定类型关联的函数。它允许我们为自定义类型定义行为并在该类型的实例上调用方法。方法的定义使用func关键字后面跟着方法名、接收者receiver和参数列表。方法的接收者是一个特殊的参数它指定了该方法与哪个类型相关联。方法的定义语法如下 func (接收者类型) 方法名(参数列表) { // 方法的实现 } 其中接收者类型表示与该方法关联的类型可以是自定义类型或内置类型。方法名是方法的名称可以自定义。参数列表表示方法的参数可以是零个或多个与方法实现的具体逻辑相关。以下是一个示例演示了如何在Go语言中定义和使用方法